Guide to Talyen
talyen
http://rp.oddworldlibrary.net:80/wiki/Main_Page
MediaWiki 1.41.0
first-letter
Media
Special
Talk
User
User talk
Talyen
Talyen talk
File
File talk
MediaWiki
MediaWiki talk
Template
Template talk
Help
Help talk
Category
Category talk
Notes
Notes talk
Module
Module talk
Template:Dated maintenance category
10
99
157
2014-01-08T08:14:55Z
wikipedia>John of Reading
0
Second attempt. Those spaces upset inline templates such as {{As of}}. Instead, try an unconditional <nowiki/>
wikitext
text/x-wiki
<nowiki/><!--This nowiki helps to prevent whitespace at the top of articles-->{{#ifeq:{{FULLROOTPAGENAME}}|Wikipedia:Template messages|<!--Do not categorize-->|<!--
-->{{#ifexpr:{{#if:{{NAMESPACE}}|0|1}}+{{#ifeq:{{{onlyarticles|no}}}|yes|0|1}}
|{{#if:{{{3|}}}
|[[Category:{{{1}}} {{{2}}} {{{3}}}]]<!--
-->{{#ifexist:Category:{{{1}}} {{{2}}} {{{3}}}
|<!--
-->|[[Category:Articles with invalid date parameter in template]]<!--
-->}}
|[[Category:{{#if:{{{5|}}}
|{{{5}}}<!--
-->|{{{1}}}<!--
-->}}]]<!--
-->}}{{#if:{{{4|}}}
|[[Category:{{{4}}}]]}}<!--
-->}}<!--
-->}}<noinclude>
{{documentation}}
</noinclude>
41e7d4000124d4f718ddf222af0b72825048c4c4
Template:Hatnote
10
127
213
2014-05-23T15:55:04Z
wikipedia>SMcCandlish
0
tweak
wikitext
text/x-wiki
<includeonly>{{#invoke:Hatnote|hatnote}}</includeonly><noinclude>
{{documentation}}
<!-- Categories go on the /doc subpage, and interwikis go on Wikidata. -->
</noinclude>
4a1d1028d07c9056022807a96051e1c82cf2a1c7
Template:Spaces
10
106
171
2015-10-25T11:38:26Z
wikipedia>Edokter
0
use class
wikitext
text/x-wiki
<span class="nowrap">{{#iferror:{{#expr:{{{1|1}}}}}
|{{#switch:{{{1}}}
|fig= 
|en= 
|em= 
|thin= 
|hair= 
|
}}
|{{#invoke:String|rep|{{#switch:{{{2}}}
|fig= 
|en= 
|em= 
|thin= 
|hair= 
|
}}|{{{1|1}}}}}
}}</span><noinclude>
{{documentation}}
</noinclude>
a9ed762825e7579f15dcb9b171b0c1c3bf524b3f
Template:Navbar
10
126
211
2017-04-22T18:49:17Z
wikipedia>Plastikspork
0
Closed
wikitext
text/x-wiki
<includeonly>{{#invoke:Navbar|navbar}}</includeonly><noinclude>
{{documentation}}
</noinclude>
868e3566b7e8a9a5a7f3dac75cac429c47de10d3
Template:Yesno-no
10
120
199
2018-02-13T20:27:17Z
wikipedia>WOSlinker
0
separate pp-template not needed
wikitext
text/x-wiki
{{safesubst:<noinclude />yesno|{{{1}}}|yes={{{yes|yes}}}|no={{{no|no}}}|blank={{{blank|no}}}|¬={{{¬|no}}}|def={{{def|no}}}}}<noinclude>
{{Documentation|Template:Yesno/doc}}
<!--Categories go in the doc page referenced above; interwikis go in Wikidata.-->
</noinclude>
1ad7b7800da1b867ead8f6ff8cef76e6201b3b56
Template:TemplateDataHeader
10
139
237
2018-02-23T16:30:31Z
wikipedia>Primefac
0
Changed protection level for "[[Template:TemplateDataHeader]]": [[WP:HIGHRISK|high-risk]] template with 4000+ transclusions ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))
wikitext
text/x-wiki
#REDIRECT [[Template:TemplateData header]]
{{R from move}}
61e461016bcb3a0a6fc4d8aea35d590298c19630
Template:Tag
10
130
219
2018-07-26T17:17:13Z
wikipedia>SMcCandlish
0
These are called attributes; no one who does HTML calls them "parameters".
wikitext
text/x-wiki
<code class="{{#ifeq:{{{wrap|}}}|yes|wrap|nowrap}}" style="{{#ifeq:{{{style|}}}|plain|border:none;background:transparent;|{{{style|}}}}}"><!--
Opening tag
-->{{#switch:{{{2|pair}}}
|c|close =
|e|empty|s|single|v|void
|o|open
|p|pair = <{{#if:{{{link|}}}|[[HTML element#{{{1|tag}}}|{{{1|tag}}}]]|{{{1|tag}}}}}{{#if:{{{params|{{{attribs|}}}}}}| {{{params|{{{attribs}}}}}}}}
}}<!--
Content between tags
-->{{#switch:{{{2|pair}}}
|c|close = {{{content|}}}
|e|empty|s|single|v|void =  />
|o|open = >{{{content|}}}
|p|pair = {{#ifeq:{{{1|tag}}}|!--||>}}{{{content|...}}}
}}<!--
Closing tag
-->{{#switch:{{{2|pair}}}
|e|empty|s|single|v|void
|o|open =
|c|close
|p|pair = {{#ifeq:{{{1|tag}}}|!--|-->|</{{{1|tag}}}>}}
}}<!--
--></code><noinclude>
{{Documentation}}
</noinclude>
eae208bc1612c834de697fa3ee9b343966cf8602
Template:Oldid
10
129
217
2018-12-10T20:41:24Z
wikipedia>Jonesey95
0
rm stray trailing space, per talk page request
wikitext
text/x-wiki
<span class="plainlinks">[{{fullurl:{{{page|{{{1|Main Page}}}}}}|oldid={{{oldid|{{{2|}}}}}}}} {{{label|{{{title|{{{3|{{#if:{{{oldid|{{{2|}}}}}}|Old revision|Current version}} of {{#if:{{{page|{{{1|}}}}}}|'''{{{page|{{{1}}}}}}'''|a page}}}}}}}}}}}]</span><noinclude>
{{documentation}}
</noinclude>
4a42ae0cc77ec0385d4b6508c5d3f366db39ecdb
Template:Template other
10
108
175
2018-12-16T22:06:25Z
wikipedia>Amorymeltzer
0
Changed protection level for "[[Template:Template other]]": [[WP:High-risk templates|Highly visible template]]: Transclusion count has increased dramatically ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite))
wikitext
text/x-wiki
{{#switch:
<!--If no or empty "demospace" parameter then detect namespace-->
{{#if:{{{demospace|}}}
| {{lc: {{{demospace}}} }} <!--Use lower case "demospace"-->
| {{#ifeq:{{NAMESPACE}}|{{ns:Template}}
| template
| other
}}
}}
| template = {{{1|}}}
| other
| #default = {{{2|}}}
}}<!--End switch--><noinclude>
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
06fb13d264df967b5232141067eb7d2b67372d76
Module:Color contrast
828
122
203
2019-01-06T22:38:25Z
wikipedia>Johnuniq
0
fix unintended color2lum global error which is causing errors; clean whitespace
Scribunto
text/plain
--
-- This module implements
-- {{Color contrast ratio}}
-- {{Greater color contrast ratio}}
-- {{ColorToLum}}
-- {{RGBColorToLum}}
--
local p = {}
local HTMLcolor = mw.loadData( 'Module:Color contrast/colors' )
local function sRGB (v)
if (v <= 0.03928) then
v = v / 12.92
else
v = math.pow((v+0.055)/1.055, 2.4)
end
return v
end
local function rgbdec2lum(R, G, B)
if ( 0 <= R and R < 256 and 0 <= G and G < 256 and 0 <= B and B < 256 ) then
return 0.2126 * sRGB(R/255) + 0.7152 * sRGB(G/255) + 0.0722 * sRGB(B/255)
else
return ''
end
end
local function hsl2lum(h, s, l)
if ( 0 <= h and h < 360 and 0 <= s and s <= 1 and 0 <= l and l <= 1 ) then
local c = (1 - math.abs(2*l - 1))*s
local x = c*(1 - math.abs( math.fmod(h/60, 2) - 1) )
local m = l - c/2
local r, g, b = m, m, m
if( 0 <= h and h < 60 ) then
r = r + c
g = g + x
elseif( 60 <= h and h < 120 ) then
r = r + x
g = g + c
elseif( 120 <= h and h < 180 ) then
g = g + c
b = b + x
elseif( 180 <= h and h < 240 ) then
g = g + x
b = b + c
elseif( 240 <= h and h < 300 ) then
r = r + x
b = b + c
elseif( 300 <= h and h < 360 ) then
r = r + c
b = b + x
end
return rgbdec2lum(255*r, 255*g, 255*b)
else
return ''
end
end
local function color2lum(c)
if (c == nil) then
return ''
end
-- html '#' entity
c = c:gsub("#", "#")
-- whitespace
c = c:match( '^%s*(.-)[%s;]*$' )
-- unstrip nowiki strip markers
c = mw.text.unstripNoWiki(c)
-- lowercase
c = c:lower()
-- first try to look it up
local L = HTMLcolor[c]
if (L ~= nil) then
return L
end
-- convert from hsl
if mw.ustring.match(c,'^hsl%([%s]*[0-9][0-9%.]*[%s]*,[%s]*[0-9][0-9%.]*%%[%s]*,[%s]*[0-9][0-9%.]*%%[%s]*%)$') then
local h, s, l = mw.ustring.match(c,'^hsl%([%s]*([0-9][0-9%.]*)[%s]*,[%s]*([0-9][0-9%.]*)%%[%s]*,[%s]*([0-9][0-9%.]*)%%[%s]*%)$')
return hsl2lum(tonumber(h), tonumber(s)/100, tonumber(l)/100)
end
-- convert from rgb
if mw.ustring.match(c,'^rgb%([%s]*[0-9][0-9]*[%s]*,[%s]*[0-9][0-9]*[%s]*,[%s]*[0-9][0-9]*[%s]*%)$') then
local R, G, B = mw.ustring.match(c,'^rgb%([%s]*([0-9][0-9]*)[%s]*,[%s]*([0-9][0-9]*)[%s]*,[%s]*([0-9][0-9]*)[%s]*%)$')
return rgbdec2lum(tonumber(R), tonumber(G), tonumber(B))
end
-- convert from rgb percent
if mw.ustring.match(c,'^rgb%([%s]*[0-9][0-9%.]*%%[%s]*,[%s]*[0-9][0-9%.]*%%[%s]*,[%s]*[0-9][0-9%.]*%%[%s]*%)$') then
local R, G, B = mw.ustring.match(c,'^rgb%([%s]*([0-9][0-9%.]*)%%[%s]*,[%s]*([0-9][0-9%.]*)%%[%s]*,[%s]*([0-9][0-9%.]*)%%[%s]*%)$')
return rgbdec2lum(255*tonumber(R)/100, 255*tonumber(G)/100, 255*tonumber(B)/100)
end
-- remove leading # (if there is one) and whitespace
c = mw.ustring.match(c, '^[%s#]*([a-f0-9]*)[%s]*$')
-- split into rgb
local cs = mw.text.split(c or '', '')
if( #cs == 6 ) then
local R = 16*tonumber('0x' .. cs[1]) + tonumber('0x' .. cs[2])
local G = 16*tonumber('0x' .. cs[3]) + tonumber('0x' .. cs[4])
local B = 16*tonumber('0x' .. cs[5]) + tonumber('0x' .. cs[6])
return rgbdec2lum(R, G, B)
elseif ( #cs == 3 ) then
local R = 16*tonumber('0x' .. cs[1]) + tonumber('0x' .. cs[1])
local G = 16*tonumber('0x' .. cs[2]) + tonumber('0x' .. cs[2])
local B = 16*tonumber('0x' .. cs[3]) + tonumber('0x' .. cs[3])
return rgbdec2lum(R, G, B)
end
-- failure, return blank
return ''
end
-- This exports the function for use in other modules.
-- The colour is passed as a string.
function p._lum(color)
return color2lum(color)
end
function p._greatercontrast(args)
local bias = tonumber(args['bias'] or '0') or 0
local css = (args['css'] and args['css'] ~= '') and true or false
local v1 = color2lum(args[1] or '')
local c2 = args[2] or '#FFFFFF'
local v2 = color2lum(c2)
local c3 = args[3] or '#000000'
local v3 = color2lum(c3)
local ratio1 = -1;
local ratio2 = -1;
if (type(v1) == 'number' and type(v2) == 'number') then
ratio1 = (v2 + 0.05)/(v1 + 0.05)
ratio1 = (ratio1 < 1) and 1/ratio1 or ratio1
end
if (type(v1) == 'number' and type(v3) == 'number') then
ratio2 = (v3 + 0.05)/(v1 + 0.05)
ratio2 = (ratio2 < 1) and 1/ratio2 or ratio2
end
if css then
local c1 = args[1] or ''
if mw.ustring.match(c1, '^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$') or
mw.ustring.match(c1, '^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$') then
c1 = '#' .. c1
end
if mw.ustring.match(c2, '^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$') or
mw.ustring.match(c2, '^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$') then
c2 = '#' .. c2
end
if mw.ustring.match(v3, '^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$') or
mw.ustring.match(v3, '^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$') then
c3 = '#' .. c3
end
return 'background-color:' .. c1 .. '; color:' .. ((ratio1 > 0) and (ratio2 > 0) and ((ratio1 + bias > ratio2) and c2 or c3) or '') .. ';'
end
return (ratio1 > 0) and (ratio2 > 0) and ((ratio1 + bias > ratio2) and c2 or c3) or ''
end
function p._ratio(args)
local v1 = color2lum(args[1])
local v2 = color2lum(args[2])
if (type(v1) == 'number' and type(v2) == 'number') then
-- v1 should be the brighter of the two.
if v2 > v1 then
v1, v2 = v2, v1
end
return (v1 + 0.05)/(v2 + 0.05)
else
return args['error'] or '?'
end
end
function p._styleratio(args)
local style = (args[1] or ''):lower()
local bg, fg = 'white', 'black'
local lum_bg, lum_fg = 1, 0
if args[2] then
local lum = color2lum(args[2])
if lum ~= '' then bg, lum_bg = args[2], lum end
end
if args[3] then
local lum = color2lum(args[3])
if lum ~= '' then fg, lum_fg = args[3], lum end
end
local slist = mw.text.split(mw.ustring.gsub(mw.ustring.gsub(style or '', '&#[Xx]23;', '#'), '#', '#'), ';')
for k = 1,#slist do
local s = slist[k]
local k,v = s:match( '^[%s]*([^:]-):([^:]-)[%s;]*$' )
k = k or ''
v = v or ''
if (k:match('^[%s]*(background)[%s]*$') or k:match('^[%s]*(background%-color)[%s]*$')) then
local lum = color2lum(v)
if( lum ~= '' ) then bg, lum_bg = v, lum end
elseif (k:match('^[%s]*(color)[%s]*$')) then
local lum = color2lum(v)
if( lum ~= '' ) then bg, lum_fg = v, lum end
end
end
if lum_bg > lum_fg then
return (lum_bg + 0.05)/(lum_fg + 0.05)
else
return (lum_fg + 0.05)/(lum_bg + 0.05)
end
end
--[[
Use {{#invoke:Color contrast|somecolor}} directly or
{{#invoke:Color contrast}} from a wrapper template.
Parameters:
-- |1= — required; A color to check.
--]]
function p.lum(frame)
local color = frame.args[1] or frame:getParent().args[1]
return p._lum(color)
end
function p.ratio(frame)
local args = frame.args[1] and frame.args or frame:getParent().args
return p._ratio(args)
end
function p.styleratio(frame)
local args = frame.args[1] and frame.args or frame:getParent().args
return p._styleratio(args)
end
function p.greatercontrast(frame)
local args = frame.args[1] and frame.args or frame:getParent().args
return p._greatercontrast(args)
end
return p
1e399769117591366a63f62996c9a407077cc711
Template:FULLBASEPAGENAME
10
135
229
2019-01-07T15:38:13Z
wikipedia>Bsherr
0
bypassing redirect, removing excess white space
wikitext
text/x-wiki
{{#if: {{Ns has subpages | {{#if:{{{1|}}}|{{NAMESPACE:{{{1}}}}}|{{NAMESPACE}}}} }}
| {{#if: {{#titleparts:{{#if:{{{1|}}}|{{{1}}}|{{FULLPAGENAME}}}}|-1}}
| {{#titleparts:{{#if:{{{1|}}}|{{{1}}}|{{FULLPAGENAME}}}}|-1}}
| {{#if:{{{1|}}}|{{{1}}}|{{FULLPAGENAME}}}}
}}
| {{#if:{{{1|}}}|{{{1}}}|{{FULLPAGENAME}}}}
}}<noinclude>
{{documentation}}
</noinclude>
a21f32ffc20eab6d41631b3fb8af4c63e153a6c3
Module:Color contrast/colors
828
123
205
2019-01-24T12:30:11Z
wikipedia>Galobtter
0
Changed protection level for "[[Module:Color contrast/colors]]": [[WP:High-risk templates|High-risk Lua module]] ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))
Scribunto
text/plain
return {
aliceblue = 0.92880068253475,
antiquewhite = 0.84646951707754,
aqua = 0.7874,
aquamarine = 0.8078549208338,
azure = 0.97265264954166,
beige = 0.8988459998705,
bisque = 0.80732327372979,
black = 0,
blanchedalmond = 0.85084439608156,
blue = 0.0722,
blueviolet = 0.12622014321946,
brown = 0.098224287876511,
burlywood = 0.51559844533893,
cadetblue = 0.29424681085422,
chartreuse = 0.76032025902623,
chocolate = 0.23898526114557,
coral = 0.37017930872924,
cornflowerblue = 0.30318641994179,
cornsilk = 0.93562110372965,
crimson = 0.16042199953026,
cyan = 0.7874,
darkblue = 0.018640801980939,
darkcyan = 0.20329317839046,
darkgoldenrod = 0.27264703559993,
darkgray = 0.39675523072563,
darkgreen = 0.091143429047575,
darkgrey = 0.39675523072563,
darkkhaki = 0.45747326349994,
darkmagenta = 0.07353047651207,
darkolivegreen = 0.12651920884889,
darkorange = 0.40016167026524,
darkorchid = 0.13413142174857,
darkred = 0.054889674531132,
darksalmon = 0.40541471563381,
darkseagreen = 0.43789249325969,
darkslateblue = 0.065792846227988,
darkslategray = 0.067608151928044,
darkslategrey = 0.067608151928044,
darkturquoise = 0.4874606277449,
darkviolet = 0.10999048339343,
deeppink = 0.23866895828276,
deepskyblue = 0.44481603395575,
dimgray = 0.14126329114027,
dimgrey = 0.14126329114027,
dodgerblue = 0.27442536991456,
firebrick = 0.10724525535015,
floralwhite = 0.95922484825004,
forestgreen = 0.18920812076002,
fuchsia = 0.2848,
gainsboro = 0.71569350050648,
ghostwhite = 0.94311261886323,
gold = 0.69860877428159,
goldenrod = 0.41919977809569,
gray = 0.2158605001139,
green = 0.15438342968146,
greenyellow = 0.80609472611453,
grey = 0.2158605001139,
honeydew = 0.96336535554782,
hotpink = 0.34658438169715,
indianred = 0.21406134963884,
indigo = 0.03107561486337,
ivory = 0.99071270600615,
khaki = 0.77012343394121,
lavender = 0.80318750514521,
lavenderblush = 0.90172748631046,
lawngreen = 0.73905893124963,
lemonchiffon = 0.94038992245622,
lightblue = 0.63709141280807,
lightcoral = 0.35522120733135,
lightcyan = 0.94587293494829,
lightgoldenrodyellow = 0.93348351018297,
lightgray = 0.65140563741982,
lightgreen = 0.69091979956865,
lightgrey = 0.65140563741982,
lightpink = 0.58566152734898,
lightsalmon = 0.4780675225206,
lightseagreen = 0.35050145117042,
lightskyblue = 0.56195637618331,
lightslategray = 0.23830165007287,
lightslategrey = 0.23830165007287,
lightsteelblue = 0.53983888284666,
lightyellow = 0.98161818392882,
lime = 0.7152,
limegreen = 0.44571042246098,
linen = 0.88357340984379,
magenta = 0.2848,
maroon = 0.045891942324215,
mediumaquamarine = 0.49389703310801,
mediumblue = 0.044077780212328,
mediumorchid = 0.21639251153773,
mediumpurple = 0.22905858091648,
mediumseagreen = 0.34393112338131,
mediumslateblue = 0.20284629471622,
mediumspringgreen = 0.70704308194184,
mediumturquoise = 0.5133827926448,
mediumvioletred = 0.14371899849357,
midnightblue = 0.02071786635086,
mintcream = 0.97834604947588,
mistyrose = 0.82183047859185,
moccasin = 0.80083000991567,
navajowhite = 0.76519682342785,
navy = 0.015585128108224,
oldlace = 0.91900633405549,
olive = 0.20027537200568,
olivedrab = 0.22593150951929,
orange = 0.4817026703631,
orangered = 0.25516243753416,
orchid = 0.31348806761439,
palegoldenrod = 0.78792647887614,
palegreen = 0.77936759006353,
paleturquoise = 0.76436077921714,
palevioletred = 0.28754994117889,
papayawhip = 0.87797100199835,
peachpuff = 0.74905589878251,
peru = 0.30113074877936,
pink = 0.63271070702466,
plum = 0.45734221587969,
powderblue = 0.68254586500605,
purple = 0.061477070432439,
rebeccapurple = 0.07492341159447,
red = 0.2126,
rosybrown = 0.32319457649407,
royalblue = 0.16663210743188,
saddlebrown = 0.097922285020521,
salmon = 0.36977241527596,
sandybrown = 0.46628543696283,
seagreen = 0.19734199706275,
seashell = 0.92737862206922,
sienna = 0.13697631337098,
silver = 0.52711512570581,
skyblue = 0.55291668518184,
slateblue = 0.14784278062136,
slategray = 0.20896704076536,
slategrey = 0.20896704076536,
snow = 0.96533341834849,
springgreen = 0.73052306068529,
steelblue = 0.20562642207625,
tan = 0.48237604163921,
teal = 0.16996855778968,
thistle = 0.56818401093733,
tomato = 0.30638612719415,
turquoise = 0.5895536427578,
violet = 0.40315452986676,
wheat = 0.74909702820482,
white = 1,
whitesmoke = 0.91309865179342,
yellow = 0.9278,
yellowgreen = 0.50762957208707,
}
6ae47fdb24de4eed5ec26d203faf5341a388987b
Template:Lua
10
82
123
2019-03-20T22:04:45Z
wikipedia>RMCD bot
0
Removing notice of move discussion
wikitext
text/x-wiki
<includeonly>{{#invoke:Lua banner|main}}</includeonly><noinclude>
{{Lua|Module:Lua banner}}
{{documentation}}
<!-- Categories go on the /doc subpage and interwikis go on Wikidata. -->
</noinclude>
dba3962144dacd289dbc34f50fbe0a7bf6d7f2f7
Template:Clc
10
83
125
2019-04-24T04:30:59Z
wikipedia>JJMC89
0
actual template is in the category
wikitext
text/x-wiki
#REDIRECT [[Template:Category link with count]]
02280e2ab57b544236e11f913e3759c5781ca9d5
Template:Ombox
10
71
101
2020-04-01T06:12:36Z
wikipedia>MusikAnimal
0
1 revision imported
wikitext
text/x-wiki
{{#invoke:Message box|ombox}}<noinclude>
{{documentation}}
<!-- Categories go on the /doc subpage, and interwikis go on Wikidata. -->
</noinclude>
0e54065432d540737b9e56c4e3a8e7f74d4534ea
Module:Arguments
828
48
57
2020-04-01T06:12:40Z
wikipedia>MusikAnimal
0
1 revision imported
Scribunto
text/plain
-- This module provides easy processing of arguments passed to Scribunto from
-- #invoke. It is intended for use by other Lua modules, and should not be
-- called from #invoke directly.
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local arguments = {}
-- Generate four different tidyVal functions, so that we don't have to check the
-- options every time we call it.
local function tidyValDefault(key, val)
if type(val) == 'string' then
val = val:match('^%s*(.-)%s*$')
if val == '' then
return nil
else
return val
end
else
return val
end
end
local function tidyValTrimOnly(key, val)
if type(val) == 'string' then
return val:match('^%s*(.-)%s*$')
else
return val
end
end
local function tidyValRemoveBlanksOnly(key, val)
if type(val) == 'string' then
if val:find('%S') then
return val
else
return nil
end
else
return val
end
end
local function tidyValNoChange(key, val)
return val
end
local function matchesTitle(given, title)
local tp = type( given )
return (tp == 'string' or tp == 'number') and mw.title.new( given ).prefixedText == title
end
local translate_mt = { __index = function(t, k) return k end }
function arguments.getArgs(frame, options)
checkType('getArgs', 1, frame, 'table', true)
checkType('getArgs', 2, options, 'table', true)
frame = frame or {}
options = options or {}
--[[
-- Set up argument translation.
--]]
options.translate = options.translate or {}
if getmetatable(options.translate) == nil then
setmetatable(options.translate, translate_mt)
end
if options.backtranslate == nil then
options.backtranslate = {}
for k,v in pairs(options.translate) do
options.backtranslate[v] = k
end
end
if options.backtranslate and getmetatable(options.backtranslate) == nil then
setmetatable(options.backtranslate, {
__index = function(t, k)
if options.translate[k] ~= k then
return nil
else
return k
end
end
})
end
--[[
-- Get the argument tables. If we were passed a valid frame object, get the
-- frame arguments (fargs) and the parent frame arguments (pargs), depending
-- on the options set and on the parent frame's availability. If we weren't
-- passed a valid frame object, we are being called from another Lua module
-- or from the debug console, so assume that we were passed a table of args
-- directly, and assign it to a new variable (luaArgs).
--]]
local fargs, pargs, luaArgs
if type(frame.args) == 'table' and type(frame.getParent) == 'function' then
if options.wrappers then
--[[
-- The wrappers option makes Module:Arguments look up arguments in
-- either the frame argument table or the parent argument table, but
-- not both. This means that users can use either the #invoke syntax
-- or a wrapper template without the loss of performance associated
-- with looking arguments up in both the frame and the parent frame.
-- Module:Arguments will look up arguments in the parent frame
-- if it finds the parent frame's title in options.wrapper;
-- otherwise it will look up arguments in the frame object passed
-- to getArgs.
--]]
local parent = frame:getParent()
if not parent then
fargs = frame.args
else
local title = parent:getTitle():gsub('/sandbox$', '')
local found = false
if matchesTitle(options.wrappers, title) then
found = true
elseif type(options.wrappers) == 'table' then
for _,v in pairs(options.wrappers) do
if matchesTitle(v, title) then
found = true
break
end
end
end
-- We test for false specifically here so that nil (the default) acts like true.
if found or options.frameOnly == false then
pargs = parent.args
end
if not found or options.parentOnly == false then
fargs = frame.args
end
end
else
-- options.wrapper isn't set, so check the other options.
if not options.parentOnly then
fargs = frame.args
end
if not options.frameOnly then
local parent = frame:getParent()
pargs = parent and parent.args or nil
end
end
if options.parentFirst then
fargs, pargs = pargs, fargs
end
else
luaArgs = frame
end
-- Set the order of precedence of the argument tables. If the variables are
-- nil, nothing will be added to the table, which is how we avoid clashes
-- between the frame/parent args and the Lua args.
local argTables = {fargs}
argTables[#argTables + 1] = pargs
argTables[#argTables + 1] = luaArgs
--[[
-- Generate the tidyVal function. If it has been specified by the user, we
-- use that; if not, we choose one of four functions depending on the
-- options chosen. This is so that we don't have to call the options table
-- every time the function is called.
--]]
local tidyVal = options.valueFunc
if tidyVal then
if type(tidyVal) ~= 'function' then
error(
"bad value assigned to option 'valueFunc'"
.. '(function expected, got '
.. type(tidyVal)
.. ')',
2
)
end
elseif options.trim ~= false then
if options.removeBlanks ~= false then
tidyVal = tidyValDefault
else
tidyVal = tidyValTrimOnly
end
else
if options.removeBlanks ~= false then
tidyVal = tidyValRemoveBlanksOnly
else
tidyVal = tidyValNoChange
end
end
--[[
-- Set up the args, metaArgs and nilArgs tables. args will be the one
-- accessed from functions, and metaArgs will hold the actual arguments. Nil
-- arguments are memoized in nilArgs, and the metatable connects all of them
-- together.
--]]
local args, metaArgs, nilArgs, metatable = {}, {}, {}, {}
setmetatable(args, metatable)
local function mergeArgs(tables)
--[[
-- Accepts multiple tables as input and merges their keys and values
-- into one table. If a value is already present it is not overwritten;
-- tables listed earlier have precedence. We are also memoizing nil
-- values, which can be overwritten if they are 's' (soft).
--]]
for _, t in ipairs(tables) do
for key, val in pairs(t) do
if metaArgs[key] == nil and nilArgs[key] ~= 'h' then
local tidiedVal = tidyVal(key, val)
if tidiedVal == nil then
nilArgs[key] = 's'
else
metaArgs[key] = tidiedVal
end
end
end
end
end
--[[
-- Define metatable behaviour. Arguments are memoized in the metaArgs table,
-- and are only fetched from the argument tables once. Fetching arguments
-- from the argument tables is the most resource-intensive step in this
-- module, so we try and avoid it where possible. For this reason, nil
-- arguments are also memoized, in the nilArgs table. Also, we keep a record
-- in the metatable of when pairs and ipairs have been called, so we do not
-- run pairs and ipairs on the argument tables more than once. We also do
-- not run ipairs on fargs and pargs if pairs has already been run, as all
-- the arguments will already have been copied over.
--]]
metatable.__index = function (t, key)
--[[
-- Fetches an argument when the args table is indexed. First we check
-- to see if the value is memoized, and if not we try and fetch it from
-- the argument tables. When we check memoization, we need to check
-- metaArgs before nilArgs, as both can be non-nil at the same time.
-- If the argument is not present in metaArgs, we also check whether
-- pairs has been run yet. If pairs has already been run, we return nil.
-- This is because all the arguments will have already been copied into
-- metaArgs by the mergeArgs function, meaning that any other arguments
-- must be nil.
--]]
if type(key) == 'string' then
key = options.translate[key]
end
local val = metaArgs[key]
if val ~= nil then
return val
elseif metatable.donePairs or nilArgs[key] then
return nil
end
for _, argTable in ipairs(argTables) do
local argTableVal = tidyVal(key, argTable[key])
if argTableVal ~= nil then
metaArgs[key] = argTableVal
return argTableVal
end
end
nilArgs[key] = 'h'
return nil
end
metatable.__newindex = function (t, key, val)
-- This function is called when a module tries to add a new value to the
-- args table, or tries to change an existing value.
if type(key) == 'string' then
key = options.translate[key]
end
if options.readOnly then
error(
'could not write to argument table key "'
.. tostring(key)
.. '"; the table is read-only',
2
)
elseif options.noOverwrite and args[key] ~= nil then
error(
'could not write to argument table key "'
.. tostring(key)
.. '"; overwriting existing arguments is not permitted',
2
)
elseif val == nil then
--[[
-- If the argument is to be overwritten with nil, we need to erase
-- the value in metaArgs, so that __index, __pairs and __ipairs do
-- not use a previous existing value, if present; and we also need
-- to memoize the nil in nilArgs, so that the value isn't looked
-- up in the argument tables if it is accessed again.
--]]
metaArgs[key] = nil
nilArgs[key] = 'h'
else
metaArgs[key] = val
end
end
local function translatenext(invariant)
local k, v = next(invariant.t, invariant.k)
invariant.k = k
if k == nil then
return nil
elseif type(k) ~= 'string' or not options.backtranslate then
return k, v
else
local backtranslate = options.backtranslate[k]
if backtranslate == nil then
-- Skip this one. This is a tail call, so this won't cause stack overflow
return translatenext(invariant)
else
return backtranslate, v
end
end
end
metatable.__pairs = function ()
-- Called when pairs is run on the args table.
if not metatable.donePairs then
mergeArgs(argTables)
metatable.donePairs = true
end
return translatenext, { t = metaArgs }
end
local function inext(t, i)
-- This uses our __index metamethod
local v = t[i + 1]
if v ~= nil then
return i + 1, v
end
end
metatable.__ipairs = function (t)
-- Called when ipairs is run on the args table.
return inext, t, 0
end
return args
end
return arguments
3134ecce8429b810d445e29eae115e2ae4c36c53
Module:Yesno
828
46
55
2020-04-01T06:27:55Z
wikipedia>MusikAnimal
0
Undid revision 948472533 by [[Special:Contributions/w>Vogone|w>Vogone]] ([[User talk:w>Vogone|talk]])
Scribunto
text/plain
-- Function allowing for consistent treatment of boolean-like wikitext input.
-- It works similarly to the template {{yesno}}.
return function (val, default)
-- If your wiki uses non-ascii characters for any of "yes", "no", etc., you
-- should replace "val:lower()" with "mw.ustring.lower(val)" in the
-- following line.
val = type(val) == 'string' and val:lower() or val
if val == nil then
return nil
elseif val == true
or val == 'yes'
or val == 'y'
or val == 'true'
or val == 't'
or val == 'on'
or tonumber(val) == 1
then
return true
elseif val == false
or val == 'no'
or val == 'n'
or val == 'false'
or val == 'f'
or val == 'off'
or tonumber(val) == 0
then
return false
else
return default
end
end
f767643e7d12126d020d88d662a3dd057817b9dc
Module:File link
828
61
81
2020-04-01T06:31:54Z
wikipedia>MusikAnimal
0
Undid revision 948472508 by [[Special:Contributions/w>IPad365|w>IPad365]] ([[User talk:w>IPad365|talk]])
Scribunto
text/plain
-- This module provides a library for formatting file wikilinks.
local yesno = require('Module:Yesno')
local checkType = require('libraryUtil').checkType
local p = {}
function p._main(args)
checkType('_main', 1, args, 'table')
-- This is basically libraryUtil.checkTypeForNamedArg, but we are rolling our
-- own function to get the right error level.
local function checkArg(key, val, level)
if type(val) ~= 'string' then
error(string.format(
"type error in '%s' parameter of '_main' (expected string, got %s)",
key, type(val)
), level)
end
end
local ret = {}
-- Adds a positional parameter to the buffer.
local function addPositional(key)
local val = args[key]
if not val then
return nil
end
checkArg(key, val, 4)
ret[#ret + 1] = val
end
-- Adds a named parameter to the buffer. We assume that the parameter name
-- is the same as the argument key.
local function addNamed(key)
local val = args[key]
if not val then
return nil
end
checkArg(key, val, 4)
ret[#ret + 1] = key .. '=' .. val
end
-- Filename
checkArg('file', args.file, 3)
ret[#ret + 1] = 'File:' .. args.file
-- Format
if args.format then
checkArg('format', args.format)
if args.formatfile then
checkArg('formatfile', args.formatfile)
ret[#ret + 1] = args.format .. '=' .. args.formatfile
else
ret[#ret + 1] = args.format
end
end
-- Border
if yesno(args.border) then
ret[#ret + 1] = 'border'
end
addPositional('location')
addPositional('alignment')
addPositional('size')
addNamed('upright')
addNamed('link')
addNamed('alt')
addNamed('page')
addNamed('class')
addNamed('lang')
addNamed('start')
addNamed('end')
addNamed('thumbtime')
addPositional('caption')
return string.format('[[%s]]', table.concat(ret, '|'))
end
function p.main(frame)
local origArgs = require('Module:Arguments').getArgs(frame, {
wrappers = 'Template:File link'
})
if not origArgs.file then
error("'file' parameter missing from [[Template:File link]]", 0)
end
-- Copy the arguments that were passed to a new table to avoid looking up
-- every possible parameter in the frame object.
local args = {}
for k, v in pairs(origArgs) do
-- Make _BLANK a special argument to add a blank parameter. For use in
-- conditional templates etc. it is useful for blank arguments to be
-- ignored, but we still need a way to specify them so that we can do
-- things like [[File:Example.png|link=]].
if v == '_BLANK' then
v = ''
end
args[k] = v
end
return p._main(args)
end
return p
66925f088d11530f2482f04181a3baaaa0ad3d0c
Template:Sandbox other
10
77
113
2020-04-03T00:08:09Z
wikipedia>Evad37
0
Also match subpage names beginning with "sandbox", per [[Template_talk:Sandbox_other#Template-protected_edit_request_on_28_March_2020|edit request]]
wikitext
text/x-wiki
{{#if:{{#ifeq:{{#invoke:String|sublength|s={{SUBPAGENAME}}|i=0|len=7}}|sandbox|1}}{{#ifeq:{{SUBPAGENAME}}|doc|1}}{{#invoke:String|match|{{PAGENAME}}|/sandbox/styles.css$|plain=false|nomatch=}}|{{{1|}}}|{{{2|}}}}}<!--
--><noinclude>{{documentation}}</noinclude>
91e4ae891d6b791615152c1fbc971414961ba872
Template:Tlf
10
133
225
2020-04-13T14:42:57Z
wikipedia>Primefac
0
Primefac moved page [[Template:Tlf]] to [[Template:Template link with link off]]: full name to indicate what it does
wikitext
text/x-wiki
#REDIRECT [[Template:Template link with link off]]
{{Redirect category shell|
{{R from move}}
}}
52759e1d3f7c9aa4a03d0b7d4f84f4c6adf53edf
Template:Sidebar
10
57
73
2020-06-04T02:43:13Z
wikipedia>Primefac
0
TFD closed as keep ([[WP:XFDC|XFDcloser]])
wikitext
text/x-wiki
{{#invoke:Sidebar|sidebar}}<noinclude>
{{documentation}}</noinclude>
ab2498000a99daf324f656b0badd187b4a3e2b42
Template:Yesno
10
103
165
2020-08-28T03:15:17Z
wikipedia>Xaosflux
0
add additional paramerters, "t", "f" - requested on talk - worked in sandbox /testcases
wikitext
text/x-wiki
{{<includeonly>safesubst:</includeonly>#switch: {{<includeonly>safesubst:</includeonly>lc: {{{1|¬}}} }}
|no
|n
|f
|false
|off
|0 = {{{no|<!-- null -->}}}
| = {{{blank|{{{no|<!-- null -->}}}}}}
|¬ = {{{¬|}}}
|yes
|y
|t
|true
|on
|1 = {{{yes|yes}}}
|#default = {{{def|{{{yes|yes}}}}}}
}}<noinclude>
{{Documentation}}
</noinclude>
629c2937bc5cf7cfe13cd2a598582af832782399
Module:TNT
828
72
103
2020-08-30T07:28:25Z
wikipedia>Johnuniq
0
Changed protection level for "[[Module:TNT]]": [[WP:High-risk templates|High-risk Lua module]]: per request at [[WP:RFPP]] to match [[Module:Excerpt]] ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))
Scribunto
text/plain
--
-- INTRO: (!!! DO NOT RENAME THIS PAGE !!!)
-- This module allows any template or module to be copy/pasted between
-- wikis without any translation changes. All translation text is stored
-- in the global Data:*.tab pages on Commons, and used everywhere.
--
-- SEE: https://www.mediawiki.org/wiki/Multilingual_Templates_and_Modules
--
-- ATTENTION:
-- Please do NOT rename this module - it has to be identical on all wikis.
-- This code is maintained at https://www.mediawiki.org/wiki/Module:TNT
-- Please do not modify it anywhere else, as it may get copied and override your changes.
-- Suggestions can be made at https://www.mediawiki.org/wiki/Module_talk:TNT
--
-- DESCRIPTION:
-- The "msg" function uses a Commons dataset to translate a message
-- with a given key (e.g. source-table), plus optional arguments
-- to the wiki markup in the current content language.
-- Use lang=xx to set language. Example:
--
-- {{#invoke:TNT | msg
-- | I18n/Template:Graphs.tab <!-- https://commons.wikimedia.org/wiki/Data:I18n/Template:Graphs.tab -->
-- | source-table <!-- uses a translation message with id = "source-table" -->
-- | param1 }} <!-- optional parameter -->
--
--
-- The "doc" function will generate the <templatedata> parameter documentation for templates.
-- This way all template parameters can be stored and localized in a single Commons dataset.
-- NOTE: "doc" assumes that all documentation is located in Data:Templatedata/* on Commons.
--
-- {{#invoke:TNT | doc | Graph:Lines }}
-- uses https://commons.wikimedia.org/wiki/Data:Templatedata/Graph:Lines.tab
-- if the current page is Template:Graph:Lines/doc
--
local p = {}
local i18nDataset = 'I18n/Module:TNT.tab'
-- Forward declaration of the local functions
local sanitizeDataset, loadData, link, formatMessage
function p.msg(frame)
local dataset, id
local params = {}
local lang = nil
for k, v in pairs(frame.args) do
if k == 1 then
dataset = mw.text.trim(v)
elseif k == 2 then
id = mw.text.trim(v)
elseif type(k) == 'number' then
table.insert(params, mw.text.trim(v))
elseif k == 'lang' and v ~= '_' then
lang = mw.text.trim(v)
end
end
return formatMessage(dataset, id, params, lang)
end
-- Identical to p.msg() above, but used from other lua modules
-- Parameters: name of dataset, message key, optional arguments
-- Example with 2 params: format('I18n/Module:TNT', 'error_bad_msgkey', 'my-key', 'my-dataset')
function p.format(dataset, key, ...)
local checkType = require('libraryUtil').checkType
checkType('format', 1, dataset, 'string')
checkType('format', 2, key, 'string')
return formatMessage(dataset, key, {...})
end
-- Identical to p.msg() above, but used from other lua modules with the language param
-- Parameters: language code, name of dataset, message key, optional arguments
-- Example with 2 params: formatInLanguage('es', I18n/Module:TNT', 'error_bad_msgkey', 'my-key', 'my-dataset')
function p.formatInLanguage(lang, dataset, key, ...)
local checkType = require('libraryUtil').checkType
checkType('formatInLanguage', 1, lang, 'string')
checkType('formatInLanguage', 2, dataset, 'string')
checkType('formatInLanguage', 3, key, 'string')
return formatMessage(dataset, key, {...}, lang)
end
-- Obsolete function that adds a 'c:' prefix to the first param.
-- "Sandbox/Sample.tab" -> 'c:Data:Sandbox/Sample.tab'
function p.link(frame)
return link(frame.args[1])
end
function p.doc(frame)
local dataset = 'Templatedata/' .. sanitizeDataset(frame.args[1])
return frame:extensionTag('templatedata', p.getTemplateData(dataset)) ..
formatMessage(i18nDataset, 'edit_doc', {link(dataset)})
end
function p.getTemplateData(dataset)
-- TODO: add '_' parameter once lua starts reindexing properly for "all" languages
local data = loadData(dataset)
local names = {}
for _, field in pairs(data.schema.fields) do
table.insert(names, field.name)
end
local params = {}
local paramOrder = {}
for _, row in pairs(data.data) do
local newVal = {}
local name = nil
for pos, val in pairs(row) do
local columnName = names[pos]
if columnName == 'name' then
name = val
else
newVal[columnName] = val
end
end
if name then
params[name] = newVal
table.insert(paramOrder, name)
end
end
-- Work around json encoding treating {"1":{...}} as an [{...}]
params['zzz123']=''
local json = mw.text.jsonEncode({
params=params,
paramOrder=paramOrder,
description=data.description
})
json = string.gsub(json,'"zzz123":"",?', "")
return json
end
-- Local functions
sanitizeDataset = function(dataset)
if not dataset then
return nil
end
dataset = mw.text.trim(dataset)
if dataset == '' then
return nil
elseif string.sub(dataset,-4) ~= '.tab' then
return dataset .. '.tab'
else
return dataset
end
end
loadData = function(dataset, lang)
dataset = sanitizeDataset(dataset)
if not dataset then
error(formatMessage(i18nDataset, 'error_no_dataset', {}))
end
-- Give helpful error to thirdparties who try and copy this module.
if not mw.ext or not mw.ext.data or not mw.ext.data.get then
error('Missing JsonConfig extension; Cannot load https://commons.wikimedia.org/wiki/Data:' .. dataset)
end
local data = mw.ext.data.get(dataset, lang)
if data == false then
if dataset == i18nDataset then
-- Prevent cyclical calls
error('Missing Commons dataset ' .. i18nDataset)
else
error(formatMessage(i18nDataset, 'error_bad_dataset', {link(dataset)}))
end
end
return data
end
-- Given a dataset name, convert it to a title with the 'commons:data:' prefix
link = function(dataset)
return 'c:Data:' .. mw.text.trim(dataset or '')
end
formatMessage = function(dataset, key, params, lang)
for _, row in pairs(loadData(dataset, lang).data) do
local id, msg = unpack(row)
if id == key then
local result = mw.message.newRawMessage(msg, unpack(params or {}))
return result:plain()
end
end
if dataset == i18nDataset then
-- Prevent cyclical calls
error('Invalid message key "' .. key .. '"')
else
error(formatMessage(i18nDataset, 'error_bad_msgkey', {key, link(dataset)}))
end
end
return p
9d0d10e54abd232c806dcabccaf03e52858634a1
Module:Anchor
828
119
197
2020-09-24T22:32:51Z
wikipedia>Pppery
0
Add class per edit request
Scribunto
text/plain
-- This module implements {{anchor}}.
local getArgs = require('Module:Arguments').getArgs
local tableTools = require('Module:TableTools')
local p = {}
function p.main(frame)
-- Get the positional arguments from #invoke, remove any nil values,
-- and pass them to p._main.
local args = getArgs(frame)
local argArray = tableTools.compressSparseArray(args)
return p._main(unpack(argArray))
end
function p._main(...)
-- Generate the list of anchors.
local anchors = {...}
local ret = {}
for _, anchor in ipairs(anchors) do
ret[#ret + 1] = '<span class="anchor" id="' .. anchor .. '"></span>'
end
return table.concat(ret)
end
return p
e41d3f5d2f2840528aebb9bac719873540fcb3b8
Module:For
828
124
207
2020-11-02T22:29:56Z
wikipedia>Andrybak
0
don't add talk pages and pages in the user namespace to [[:Category:Hatnote templates with errors]] – this is similar to [[Special:Diff/953627233/986768317|Module:Other uses of]] and [[Special:Diff/967664662|Module:Hatnote]]
Scribunto
text/plain
local mArguments --initialize lazily
local mHatlist = require('Module:Hatnote list')
local mHatnote = require('Module:Hatnote')
local yesNo = require('Module:Yesno')
local p = {}
--Implements {{For}} from the frame
--uses capitalized "For" to avoid collision with Lua reserved word "for"
function p.For (frame)
mArguments = require('Module:Arguments')
return p._For(mArguments.getArgs(frame))
end
--Implements {{For}} but takes a manual arguments table
function p._For (args)
local use = args[1]
if (not use) then
return mHatnote.makeWikitextError(
'no context parameter provided. Use {{other uses}} for "other uses" hatnotes.',
'Template:For#Errors',
args.category
)
end
local pages = {}
function two (a, b) return a, b, 1 end --lets us run ipairs from 2
for k, v in two(ipairs(args)) do table.insert(pages, v) end
local title = mw.title.getCurrentTitle()
local skipCat = title.isTalkPage or title.namespace == 2 --don't categorise talk pages and userspace
local oddCat = skipCat and '' or '[[Category:Hatnote templates using unusual parameters]]'
local category = yesNo(args.category)
return mHatnote._hatnote(
mHatlist.forSeeTableToString({{use = use, pages = pages}}),
{selfref = args.selfref}
) .. (
(use == 'other uses') and ((category == true) or (category == nil)) and
oddCat or ''
)
end
return p
2faf1bd8c657f3425af829cbde9733a936d8d4f4
Template:Template link with link off
10
132
223
2020-11-21T12:06:17Z
wikipedia>Primefac
0
update
wikitext
text/x-wiki
<includeonly>{{#Invoke:Template link general|main|nowrap=yes|nolink=yes}}</includeonly><noinclude>
{{Documentation|1=Template:Tlg/doc
|content = {{tlg/doc|tlf}}
}}
<!-- Add categories to the /doc subpage, not here! -->
</noinclude>
b099fea5d1f36b0b4b9cb253ad3a9f4e095f6851
Template:Anchor
10
117
193
2021-01-31T22:06:17Z
wikipedia>Plastikspork
0
Fix |=FOO bug where {{anchor|=FOO}} transcludes [[Template:FOO]]
wikitext
text/x-wiki
{{<includeonly>safesubst:</includeonly>#invoke:anchor|main}}<noinclude>
{{Documentation}}
<!-- Categories go on the /doc subpage, and interwikis go on Wikidata. -->
</noinclude>
7d65122552007ac959072bddfa6f723296c81998
Template:Tl
10
49
58
2021-02-12T22:03:00Z
wikipedia>Anthony Appleyard
0
Anthony Appleyard moved page [[Template:Tl]] to [[Template:Template link]]: [[Special:Permalink/1006428669|Requested]] by Buidhe at [[WP:RM/TR]]: RM closed as move
wikitext
text/x-wiki
#REDIRECT [[Template:Template link]]
{{Redirect category shell|
{{R from move}}
}}
d6593bb3b4a866249f55d0f34b047a71fe1f1529
Template:Template link
10
50
60
2021-03-25T19:03:22Z
wikipedia>Izno
0
[[Wikipedia:Templates for discussion/Log/2021 March 18#Template:Tlu]] closed as keep ([[WP:XFDC#4.0.11|XFDcloser]])
wikitext
text/x-wiki
{{[[Template:{{{1}}}|{{{1}}}]]}}<noinclude>{{documentation}}
<!-- Categories go on the /doc subpage and interwikis go on Wikidata. -->
</noinclude>
eabbec62efe3044a98ebb3ce9e7d4d43c222351d
Template:Lua sidebar/styles.css
10
87
133
2021-04-24T04:27:37Z
wikipedia>Izno
0
max-width
sanitized-css
text/css
.lua-sidebar {
width: auto;
max-width: 22em;
}
9984d36eb49fae70dd00527c993784d775409a6b
Template:Category link with count
10
84
127
2021-06-11T18:13:44Z
wikipedia>GKFX
0
Support wider range of (valid) input format
wikitext
text/x-wiki
[[:Category:{{#invoke:string|replace|1={{{1}}}|2=^:?[Cc]ategory:|3=|plain=false}}|<!--
-->{{#if:{{{name|}}}|{{{name}}}|Category:{{#invoke:string|replace|1={{{1}}}|2=^:?[Cc]ategory:|3=|plain=false}}}}<!--
-->]] ({{PAGESINCATEGORY:{{#invoke:string|replace|1={{{1}}}|2=^:?[Cc]ategory:|3=|plain=false}}|{{{2|all}}}}})<noinclude>
{{Documentation}}
</noinclude>
f93f1540b8c157703bd6d24ae35c35bef745981d
Template:Navbox
10
45
53
2021-06-26T18:05:09Z
wikipedia>Trialpears
0
Remove TfD notice as it wouldn't involve any changes to this template.
wikitext
text/x-wiki
<includeonly>{{#invoke:Navbox|navbox}}</includeonly><noinclude>
{{Documentation}}
</noinclude>
fe9b964401f895918ee4fe078678f1722a3c41ec
Module:Hatnote/styles.css
828
113
185
2021-07-12T19:22:27Z
wikipedia>Izno
0
per my talk page
sanitized-css
text/css
/* {{pp|small=y}} */
.hatnote {
font-style: italic;
}
/* Limit structure CSS to divs because of [[Module:Hatnote inline]] */
div.hatnote {
/* @noflip */
padding-left: 1.6em;
margin-bottom: 0.5em;
}
.hatnote i {
font-style: normal;
}
/* The templatestyles element inserts a link element before hatnotes.
* TODO: Remove link if/when WMF resolves T200206 */
.hatnote + link + .hatnote {
margin-top: -0.5em;
}
44680ffd6e888866df2cdfa0341af9c7b97da94c
Template:For
10
121
201
2021-07-17T12:58:12Z
wikipedia>Plastikspork
0
[[Wikipedia:Templates for discussion/Log/2021 July 8#Template:For]] closed as do not merge ([[WP:XFDC#4.0.12|XFDcloser]])
wikitext
text/x-wiki
<includeonly>{{#invoke:For|For}}</includeonly><noinclude>
{{Documentation}}
</noinclude>
3f70c0fa7cd736071e7c6e7dcd90ff3704df26bb
Module:Redirect
828
53
65
2021-09-10T07:46:37Z
wikipedia>Johnuniq
0
restore p.getTargetFromText which is used by [[Module:RfD]] which is causing "Lua error in Module:RfD at line 87: attempt to call upvalue 'getTargetFromText' (a nil value)"
Scribunto
text/plain
-- This module provides functions for getting the target of a redirect page.
local p = {}
-- Gets a mw.title object, using pcall to avoid generating script errors if we
-- are over the expensive function count limit (among other possible causes).
local function getTitle(...)
local success, titleObj = pcall(mw.title.new, ...)
if success then
return titleObj
else
return nil
end
end
-- Gets the name of a page that a redirect leads to, or nil if it isn't a
-- redirect.
function p.getTargetFromText(text)
local target = string.match(
text,
"^%s*#[Rr][Ee][Dd][Ii][Rr][Ee][Cc][Tt]%s*:?%s*%[%[([^%[%]|]-)%]%]"
) or string.match(
text,
"^%s*#[Rr][Ee][Dd][Ii][Rr][Ee][Cc][Tt]%s*:?%s*%[%[([^%[%]|]-)|[^%[%]]-%]%]"
)
return target and mw.uri.decode(target, 'PATH')
end
-- Gets the target of a redirect. If the page specified is not a redirect,
-- returns nil.
function p.getTarget(page, fulltext)
-- Get the title object. Both page names and title objects are allowed
-- as input.
local titleObj
if type(page) == 'string' or type(page) == 'number' then
titleObj = getTitle(page)
elseif type(page) == 'table' and type(page.getContent) == 'function' then
titleObj = page
else
error(string.format(
"bad argument #1 to 'getTarget'"
.. " (string, number, or title object expected, got %s)",
type(page)
), 2)
end
if not titleObj then
return nil
end
local targetTitle = titleObj.redirectTarget
if targetTitle then
if fulltext then
return targetTitle.fullText
else
return targetTitle.prefixedText
end
else
return nil
end
end
--[[
-- Given a single page name determines what page it redirects to and returns the
-- target page name, or the passed page name when not a redirect. The passed
-- page name can be given as plain text or as a page link.
--
-- Returns page name as plain text, or when the bracket parameter is given, as a
-- page link. Returns an error message when page does not exist or the redirect
-- target cannot be determined for some reason.
--]]
function p.luaMain(rname, bracket, fulltext)
if type(rname) ~= "string" or not rname:find("%S") then
return nil
end
bracket = bracket and "[[%s]]" or "%s"
rname = rname:match("%[%[(.+)%]%]") or rname
local target = p.getTarget(rname, fulltext)
local ret = target or rname
ret = getTitle(ret)
if ret then
if fulltext then
ret = ret.fullText
else
ret = ret.prefixedText
end
return bracket:format(ret)
else
return nil
end
end
-- Provides access to the luaMain function from wikitext.
function p.main(frame)
local args = require('Module:Arguments').getArgs(frame, {frameOnly = true})
return p.luaMain(args[1], args.bracket, args.fulltext) or ''
end
-- Returns true if the specified page is a redirect, and false otherwise.
function p.luaIsRedirect(page)
local titleObj = getTitle(page)
if not titleObj then
return false
end
if titleObj.isRedirect then
return true
else
return false
end
end
-- Provides access to the luaIsRedirect function from wikitext, returning 'yes'
-- if the specified page is a redirect, and the blank string otherwise.
function p.isRedirect(frame)
local args = require('Module:Arguments').getArgs(frame, {frameOnly = true})
if p.luaIsRedirect(args[1]) then
return 'yes'
else
return ''
end
end
return p
a224c45940343d66f49a78b0a39b2045e2c45d20
Template:PAGENAMETDOC
10
143
245
2021-09-19T22:49:59Z
wikipedia>JJMC89 bot III
0
Moving [[:Category:Wikipedia variable-like templates]] to [[:Category:Wikipedia magic word templates]] per [[Wikipedia:Categories for discussion/Log/2021 September 11#Category:Wikipedia variable-like templates]]
wikitext
text/x-wiki
{{#ifeq:{{#invoke:String|find|{{FULLPAGENAME}}|/sandbox%d*$|plain=false}}|0|{{{{#if:{{{1|}}}||FULL}}BASEPAGENAME}}|{{{{#if:{{{1|}}}||FULL}}PAGENAME}}}}<noinclude>
{{Documentation|content=
This template returns the current {{Tlx|FULLBASEPAGENAME}}, unless the title ends in <code>/sandbox</code> plus any number of digits, in which case it returns the {{tlx|FULLPAGENAME}}. It is primarily meant for demonstrating the sandbox version of templates in their documentation.
This template takes one numbered parameter (<code>1</code>); if anything is in this parameter then it will return <code>{{BASEPAGENAME}}</code> and <code>{{PAGENAME}}</code>, which have no namespace prefix.
}}
[[Category:Wikipedia magic word templates]]
</noinclude>
ae0c3ac1a7415671c46f970d5faad2fd708640b0
Module:Sidebar/styles.css
828
70
99
2021-09-20T01:15:45Z
wikipedia>Goszei
0
self-rv, it's a little tight
sanitized-css
text/css
/* {{pp-template}} */
/* TODO: Invert width design to be "mobile first" */
.sidebar {
/* TODO: Ask if we should have max-width 22em instead */
width: 22em;
/* @noflip */
float: right;
/* @noflip */
clear: right;
/* @noflip */
margin: 0.5em 0 1em 1em;
background: #f8f9fa;
border: 1px solid #aaa;
padding: 0.2em;
text-align: center;
line-height: 1.4em;
font-size: 88%;
border-collapse: collapse;
/* Timeless has display: none on .nomobile at mobile resolutions, so we
* unhide it with display: table and let precedence and proximity win.
*/
display: table;
}
/* Unfortunately, so does Minerva desktop, except Minerva drops an
* !important on the declaration. So we have to be mean for Minerva users.
* Mobile removes the element entirely with `wgMFRemovableClasses` in
* https://github.com/wikimedia/operations-mediawiki-config/blob/master/
wmf-config/InitialiseSettings.php#L16992
* which is why displaying it categorically with display: table works.
* We don't really want to expose the generic user in the wild on mobile to have
* to deal with sidebars. (Maybe the ones with collapsible lists, so that
* might be an improvement. That is blocked on [[:phab:T111565]].)
*/
body.skin-minerva .sidebar {
display: table !important;
/* also, minerva is way too aggressive about other stylings on tables.
* TODO remove when this template gets moved to a div. plans on talk page.
* We always float right on Minerva because that's a lot of extra CSS
* otherwise. */
float: right !important;
margin: 0.5em 0 1em 1em !important;
}
.sidebar-subgroup {
width: 100%;
margin: 0;
border-spacing: 0;
}
.sidebar-left {
/* @noflip */
float: left;
/* @noflip */
clear: left;
/* @noflip */
margin: 0.5em 1em 1em 0;
}
.sidebar-none {
float: none;
clear: both;
/* @noflip */
margin: 0.5em 1em 1em 0;
}
.sidebar-outer-title {
padding: 0 0.4em 0.2em;
font-size: 125%;
line-height: 1.2em;
font-weight: bold;
}
.sidebar-top-image {
padding: 0.4em;
}
.sidebar-top-caption,
.sidebar-pretitle-with-top-image,
.sidebar-caption {
padding: 0.2em 0.4em 0;
line-height: 1.2em;
}
.sidebar-pretitle {
padding: 0.4em 0.4em 0;
line-height: 1.2em;
}
.sidebar-title,
.sidebar-title-with-pretitle {
padding: 0.2em 0.8em;
font-size: 145%;
line-height: 1.2em;
}
.sidebar-title-with-pretitle {
padding: 0.1em 0.4em;
}
.sidebar-image {
padding: 0.2em 0.4em 0.4em;
}
.sidebar-heading {
padding: 0.1em 0.4em;
}
.sidebar-content {
padding: 0 0.5em 0.4em;
}
.sidebar-content-with-subgroup {
padding: 0.1em 0.4em 0.2em;
}
.sidebar-above,
.sidebar-below {
padding: 0.3em 0.8em;
font-weight: bold;
}
.sidebar-collapse .sidebar-above,
.sidebar-collapse .sidebar-below {
border-top: 1px solid #aaa;
border-bottom: 1px solid #aaa;
}
.sidebar-navbar {
text-align: right;
font-size: 115%;
padding: 0 0.4em 0.4em;
}
.sidebar-list-title {
padding: 0 0.4em;
text-align: left;
font-weight: bold;
line-height: 1.6em;
font-size: 105%;
}
/* centered text with mw-collapsible headers is finicky */
.sidebar-list-title-c {
padding: 0 0.4em;
text-align: center;
margin: 0 3.3em;
}
@media (max-width: 720px) {
/* users have wide latitude to set arbitrary width and margin :(
"Super-specific" selector to prevent overriding this appearance by
lower level sidebars too */
body.mediawiki .sidebar {
width: 100% !important;
clear: both;
float: none !important; /* Remove when we div based; Minerva is dumb */
margin-left: 0 !important;
margin-right: 0 !important;
}
/* TODO: We might consider making all links wrap at small resolutions and then
* only introduce nowrap at higher resolutions. Do when we invert the media
* query.
*/
}
7d621b35a37807a103b59075851fe36201204ceb
Template:High use
10
93
145
2021-10-05T19:24:15Z
wikipedia>MusikBot II
0
Protected "[[Template:High use]]": [[Wikipedia:High-risk templates|High-risk template or module]]: 345 transclusions ([[User:MusikBot II/TemplateProtector|more info]]) ([Edit=Require autoconfirmed or confirmed access] (indefinite))
wikitext
text/x-wiki
#Redirect [[Template:High-use]]
{{Redirect category shell|{{R from modification}}{{R from template shortcut}}}}
65ce33c8f2d9659b46256ceb1f7fe57859f66fb2
Template:Module other
10
85
129
2021-10-20T19:50:22Z
wikipedia>MusikBot II
0
Changed protection settings for "[[Template:Module other]]": [[Wikipedia:High-risk templates|High-risk template or module]]: 3570 transclusions ([[User:MusikBot II/TemplateProtector|more info]]) ([Edit=Require extended confirmed access] (indefinite) [Move=Require extended confirmed access] (indefinite))
wikitext
text/x-wiki
{{#switch:
<!--If no or empty "demospace" parameter then detect namespace-->
{{#if:{{{demospace|}}}
| {{lc: {{{demospace}}} }} <!--Use lower case "demospace"-->
| {{#ifeq:{{NAMESPACE}}|{{ns:Module}}
| module
| other
}}
}}
| module = {{{1|}}}
| other
| #default = {{{2|}}}
}}<!--End switch--><noinclude>
{{documentation}}
<!-- Add categories to the /doc subpage, not here! -->
</noinclude>
503694836c1b07142e63fd35d8be69ec8bb9ffe7
Template:Main
10
110
179
2021-11-07T22:34:09Z
wikipedia>Nihiltres
0
Includeonly the template to avoid errors on the template pages
wikitext
text/x-wiki
<includeonly>{{#invoke:Labelled list hatnote|labelledList|Main article|Main articles|Main page|Main pages}}</includeonly><noinclude>
{{documentation}}
<!-- Categories go on the /doc subpage, and interwikis go on Wikidata. -->
</noinclude>
99ebf54e265aa9354bc4861d3b0da913f1441ede
Template:Lua sidebar
10
86
131
2021-11-15T22:24:39Z
wikipedia>Izno
0
reduce expansion size slightly
wikitext
text/x-wiki
{{Sidebar
| class = lua-sidebar
| templatestyles = Template:Lua sidebar/styles.css
| title = Related pages
| content1 = {{plainlist}}
* [[Template:{{{template|{{{title|{{BASEPAGENAME}}}}}}}}|Template]] {{#if:{{#invoke:redirect|isRedirect|Template talk:{{{template|{{{title|{{BASEPAGENAME}}}}}}}}}}||([[Template talk:{{{template|{{{title|{{BASEPAGENAME}}}}}}}}|talk]])}}
* [[Template:{{{template|{{{title|{{BASEPAGENAME}}}}}}}}/sandbox|Template sandbox]]
* [[Template:{{{template|{{{title|{{BASEPAGENAME}}}}}}}}/testcases|Template testcases]]
* [[Template:{{{template|{{{title|{{BASEPAGENAME}}}}}}}}/doc|Template doc]]
* [[Special:PrefixIndex/Template:{{{template|{{{title|{{BASEPAGENAME}}}}}}}}/|Template subpages]]
* [[Module:{{{module|{{{title|{{BASEPAGENAME}}}}}}}}|Module]] {{#if:{{#invoke:redirect|isRedirect|Module talk:{{{module|{{{title|{{BASEPAGENAME}}}}}}}}}}||([[Module talk:{{{module|{{{title|{{BASEPAGENAME}}}}}}}}|talk]])}}
* [[Module:{{{module|{{{title|{{BASEPAGENAME}}}}}}}}/sandbox|Module sandbox]]
* [[Module talk:{{{module|{{{title|{{BASEPAGENAME}}}}}}}}/testcases|Module testcases]]
* [[Module:{{{module|{{{title|{{BASEPAGENAME}}}}}}}}/doc|Module doc]]
* [[Special:PrefixIndex/Module:{{{module|{{{title|{{BASEPAGENAME}}}}}}}}/|Module subpages]]
{{endplainlist}}
| content2 = {{{1|}}}
}}<noinclude>
{{Documentation}}
</noinclude>
f11e49d67a400d29f6d73720fea7eb5a273ab663
Template:Main other
10
104
167
2021-12-10T16:08:06Z
wikipedia>Xaosflux
0
<!-- Add categories to the /doc subpage; interwikis go to Wikidata, thank you! -->
wikitext
text/x-wiki
{{#switch:
<!--If no or empty "demospace" parameter then detect namespace-->
{{#if:{{{demospace|}}}
| {{lc: {{{demospace}}} }} <!--Use lower case "demospace"-->
| {{#ifeq:{{NAMESPACE}}|{{ns:0}}
| main
| other
}}
}}
| main = {{{1|}}}
| other
| #default = {{{2|}}}
}}<noinclude>
{{documentation}}
<!-- Add categories to the /doc subpage; interwikis go to Wikidata, thank you! -->
</noinclude>
86ad907ffeea3cc545159e00cd1f2d6433946450
Module:Navbox/styles.css
828
65
89
2021-12-21T22:10:10Z
wikipedia>Izno
0
remove qualifications on th - this will remove styling from "hand-crafted" navboxes, but there's no other elegant way to deal with it. see talk page
sanitized-css
text/css
/* {{pp|small=y}} */
.navbox {
box-sizing: border-box;
border: 1px solid #a2a9b1;
width: 100%;
clear: both;
font-size: 88%;
text-align: center;
padding: 1px;
margin: 1em auto 0; /* Prevent preceding content from clinging to navboxes */
}
.navbox .navbox {
margin-top: 0; /* No top margin for nested navboxes */
}
.navbox + .navbox, /* TODO: remove first line after transclusions have updated */
.navbox + .navbox-styles + .navbox {
margin-top: -1px; /* Single pixel border between adjacent navboxes */
}
.navbox-inner,
.navbox-subgroup {
width: 100%;
}
.navbox-group,
.navbox-title,
.navbox-abovebelow {
padding: 0.25em 1em;
line-height: 1.5em;
text-align: center;
}
.navbox-group {
white-space: nowrap;
/* @noflip */
text-align: right;
}
.navbox,
.navbox-subgroup {
background-color: #fdfdfd;
}
.navbox-list {
line-height: 1.5em;
border-color: #fdfdfd; /* Must match background color */
}
.navbox-list-with-group {
text-align: left;
border-left-width: 2px;
border-left-style: solid;
}
/* cell spacing for navbox cells */
/* Borders above 2nd, 3rd, etc. rows */
/* TODO: figure out how to replace tr as structure;
* with div structure it should be just a matter of first-child */
tr + tr > .navbox-abovebelow,
tr + tr > .navbox-group,
tr + tr > .navbox-image,
tr + tr > .navbox-list {
border-top: 2px solid #fdfdfd; /* Must match background color */
}
.navbox-title {
background-color: #ccf; /* Level 1 color */
}
.navbox-abovebelow,
.navbox-group,
.navbox-subgroup .navbox-title {
background-color: #ddf; /* Level 2 color */
}
.navbox-subgroup .navbox-group,
.navbox-subgroup .navbox-abovebelow {
background-color: #e6e6ff; /* Level 3 color */
}
.navbox-even {
background-color: #f7f7f7;
}
.navbox-odd {
background-color: transparent;
}
/* TODO: figure out how to remove reliance on td as structure */
.navbox .hlist td dl,
.navbox .hlist td ol,
.navbox .hlist td ul,
.navbox td.hlist dl,
.navbox td.hlist ol,
.navbox td.hlist ul {
padding: 0.125em 0;
}
.navbox .navbar {
display: block;
font-size: 100%;
}
.navbox-title .navbar {
/* @noflip */
float: left;
/* @noflip */
text-align: left;
/* @noflip */
margin-right: 0.5em;
}
e80b0d7a5770e6e105dab832deb6c37a5245ebc6
Template:FULLROOTPAGENAME
10
100
159
2022-01-02T08:54:02Z
wikipedia>Dinoguy1000
0
fix "|=foo" bug
wikitext
text/x-wiki
{{ safesubst:<noinclude/>#if: {{ safesubst:<noinclude/>Ns has subpages | {{ safesubst:<noinclude/>#if:{{{1|}}}|{{ safesubst:<noinclude/>NAMESPACE:{{{1}}}}}|{{ safesubst:<noinclude/>NAMESPACE}}}} }}
| {{ safesubst:<noinclude/>#titleparts:{{ safesubst:<noinclude/>#if:{{{1|}}}|{{{1}}}|{{ safesubst:<noinclude/>FULLPAGENAME}}}}|1}}
| {{ safesubst:<noinclude/>#if:{{{1|}}}|{{{1}}}|{{ safesubst:<noinclude/>FULLPAGENAME}}}}
}}<noinclude>
{{documentation}}
</noinclude>
fd0c4e7050dded2d50e5df405e6e5e31dd0d46ac
Module:Navbar/styles.css
828
116
191
2022-01-03T23:12:15Z
wikipedia>Izno
0
navbar styles that were moved to parent templates
sanitized-css
text/css
/* {{pp|small=yes}} */
.navbar {
display: inline;
font-size: 88%;
font-weight: normal;
}
.navbar-collapse {
float: left;
text-align: left;
}
.navbar-boxtext {
word-spacing: 0;
}
.navbar ul {
display: inline-block;
white-space: nowrap;
line-height: inherit;
}
.navbar-brackets::before {
margin-right: -0.125em;
content: '[ ';
}
.navbar-brackets::after {
margin-left: -0.125em;
content: ' ]';
}
.navbar li {
word-spacing: -0.125em;
}
.navbar a > span,
.navbar a > abbr {
text-decoration: inherit;
}
.navbar-mini abbr {
font-variant: small-caps;
border-bottom: none;
text-decoration: none;
cursor: inherit;
}
.navbar-ct-full {
font-size: 114%;
margin: 0 7em;
}
.navbar-ct-mini {
font-size: 114%;
margin: 0 4em;
}
9d4056f949b4f0b159e3d40dfb1a5f01e72f9571
Module:TableTools
828
56
71
2022-01-31T13:08:18Z
wikipedia>MSGJ
0
updates/fixes requested by [[User:Uzume]]
Scribunto
text/plain
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should not --
-- be called directly from #invoke. --
------------------------------------------------------------------------------------
local libraryUtil = require('libraryUtil')
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
local checkType = libraryUtil.checkType
local checkTypeMulti = libraryUtil.checkTypeMulti
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given value is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
function p.isPositiveInteger(v)
return type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity
end
------------------------------------------------------------------------------------
-- isNan
--
-- This function returns true if the given number is a NaN value, and false if
-- not. Although it doesn't operate on tables, it is included here as it is useful
-- for determining whether a value can be a valid table key. Lua will generate an
-- error if a NaN is used as a table key.
------------------------------------------------------------------------------------
function p.isNan(v)
return type(v) == 'number' and v ~= v
end
------------------------------------------------------------------------------------
-- shallowClone
--
-- This returns a clone of a table. The value returned is a new table, but all
-- subtables and functions are shared. Metamethods are respected, but the returned
-- table will have no metatable of its own.
------------------------------------------------------------------------------------
function p.shallowClone(t)
checkType('shallowClone', 1, t, 'table')
local ret = {}
for k, v in pairs(t) do
ret[k] = v
end
return ret
end
------------------------------------------------------------------------------------
-- removeDuplicates
--
-- This removes duplicate values from an array. Non-positive-integer keys are
-- ignored. The earliest value is kept, and all subsequent duplicate values are
-- removed, but otherwise the array order is unchanged.
------------------------------------------------------------------------------------
function p.removeDuplicates(arr)
checkType('removeDuplicates', 1, arr, 'table')
local isNan = p.isNan
local ret, exists = {}, {}
for _, v in ipairs(arr) do
if isNan(v) then
-- NaNs can't be table keys, and they are also unique, so we don't need to check existence.
ret[#ret + 1] = v
else
if not exists[v] then
ret[#ret + 1] = v
exists[v] = true
end
end
end
return ret
end
------------------------------------------------------------------------------------
-- numKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
function p.numKeys(t)
checkType('numKeys', 1, t, 'table')
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
------------------------------------------------------------------------------------
-- affixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will return
-- {1, 3, 6}.
------------------------------------------------------------------------------------
function p.affixNums(t, prefix, suffix)
checkType('affixNums', 1, t, 'table')
checkType('affixNums', 2, prefix, 'string', true)
checkType('affixNums', 3, suffix, 'string', true)
local function cleanPattern(s)
-- Cleans a pattern so that the magic characters ()%.[]*+-?^$ are interpreted literally.
return s:gsub('([%(%)%%%.%[%]%*%+%-%?%^%$])', '%%%1')
end
prefix = prefix or ''
suffix = suffix or ''
prefix = cleanPattern(prefix)
suffix = cleanPattern(suffix)
local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$'
local nums = {}
for k in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, pattern)
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
------------------------------------------------------------------------------------
-- numData
--
-- Given a table with keys like {"foo1", "bar1", "foo2", "baz2"}, returns a table
-- of subtables in the format
-- {[1] = {foo = 'text', bar = 'text'}, [2] = {foo = 'text', baz = 'text'}}.
-- Keys that don't end with an integer are stored in a subtable named "other". The
-- compress option compresses the table so that it can be iterated over with
-- ipairs.
------------------------------------------------------------------------------------
function p.numData(t, compress)
checkType('numData', 1, t, 'table')
checkType('numData', 2, compress, 'boolean', true)
local ret = {}
for k, v in pairs(t) do
local prefix, num = mw.ustring.match(tostring(k), '^([^0-9]*)([1-9][0-9]*)$')
if num then
num = tonumber(num)
local subtable = ret[num] or {}
if prefix == '' then
-- Positional parameters match the blank string; put them at the start of the subtable instead.
prefix = 1
end
subtable[prefix] = v
ret[num] = subtable
else
local subtable = ret.other or {}
subtable[k] = v
ret.other = subtable
end
end
if compress then
local other = ret.other
ret = p.compressSparseArray(ret)
ret.other = other
end
return ret
end
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
function p.compressSparseArray(t)
checkType('compressSparseArray', 1, t, 'table')
local ret = {}
local nums = p.numKeys(t)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
function p.sparseIpairs(t)
checkType('sparseIpairs', 1, t, 'table')
local nums = p.numKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
else
return nil, nil
end
end
end
------------------------------------------------------------------------------------
-- size
--
-- This returns the size of a key/value pair table. It will also work on arrays,
-- but for arrays it is more efficient to use the # operator.
------------------------------------------------------------------------------------
function p.size(t)
checkType('size', 1, t, 'table')
local i = 0
for _ in pairs(t) do
i = i + 1
end
return i
end
local function defaultKeySort(item1, item2)
-- "number" < "string", so numbers will be sorted before strings.
local type1, type2 = type(item1), type(item2)
if type1 ~= type2 then
return type1 < type2
elseif type1 == 'table' or type1 == 'boolean' or type1 == 'function' then
return tostring(item1) < tostring(item2)
else
return item1 < item2
end
end
------------------------------------------------------------------------------------
-- keysToList
--
-- Returns an array of the keys in a table, sorted using either a default
-- comparison function or a custom keySort function.
------------------------------------------------------------------------------------
function p.keysToList(t, keySort, checked)
if not checked then
checkType('keysToList', 1, t, 'table')
checkTypeMulti('keysToList', 2, keySort, {'function', 'boolean', 'nil'})
end
local arr = {}
local index = 1
for k in pairs(t) do
arr[index] = k
index = index + 1
end
if keySort ~= false then
keySort = type(keySort) == 'function' and keySort or defaultKeySort
table.sort(arr, keySort)
end
return arr
end
------------------------------------------------------------------------------------
-- sortedPairs
--
-- Iterates through a table, with the keys sorted using the keysToList function.
-- If there are only numerical keys, sparseIpairs is probably more efficient.
------------------------------------------------------------------------------------
function p.sortedPairs(t, keySort)
checkType('sortedPairs', 1, t, 'table')
checkType('sortedPairs', 2, keySort, 'function', true)
local arr = p.keysToList(t, keySort, true)
local i = 0
return function ()
i = i + 1
local key = arr[i]
if key ~= nil then
return key, t[key]
else
return nil, nil
end
end
end
------------------------------------------------------------------------------------
-- isArray
--
-- Returns true if the given value is a table and all keys are consecutive
-- integers starting at 1.
------------------------------------------------------------------------------------
function p.isArray(v)
if type(v) ~= 'table' then
return false
end
local i = 0
for _ in pairs(v) do
i = i + 1
if v[i] == nil then
return false
end
end
return true
end
------------------------------------------------------------------------------------
-- isArrayLike
--
-- Returns true if the given value is iterable and all keys are consecutive
-- integers starting at 1.
------------------------------------------------------------------------------------
function p.isArrayLike(v)
if not pcall(pairs, v) then
return false
end
local i = 0
for _ in pairs(v) do
i = i + 1
if v[i] == nil then
return false
end
end
return true
end
------------------------------------------------------------------------------------
-- invert
--
-- Transposes the keys and values in an array. For example, {"a", "b", "c"} ->
-- {a = 1, b = 2, c = 3}. Duplicates are not supported (result values refer to
-- the index of the last duplicate) and NaN values are ignored.
------------------------------------------------------------------------------------
function p.invert(arr)
checkType("invert", 1, arr, "table")
local isNan = p.isNan
local map = {}
for i, v in ipairs(arr) do
if not isNan(v) then
map[v] = i
end
end
return map
end
------------------------------------------------------------------------------------
-- listToSet
--
-- Creates a set from the array part of the table. Indexing the set by any of the
-- values of the array returns true. For example, {"a", "b", "c"} ->
-- {a = true, b = true, c = true}. NaN values are ignored as Lua considers them
-- never equal to any value (including other NaNs or even themselves).
------------------------------------------------------------------------------------
function p.listToSet(arr)
checkType("listToSet", 1, arr, "table")
local isNan = p.isNan
local set = {}
for _, v in ipairs(arr) do
if not isNan(v) then
set[v] = true
end
end
return set
end
------------------------------------------------------------------------------------
-- deepCopy
--
-- Recursive deep copy function. Preserves identities of subtables.
------------------------------------------------------------------------------------
local function _deepCopy(orig, includeMetatable, already_seen)
-- Stores copies of tables indexed by the original table.
already_seen = already_seen or {}
local copy = already_seen[orig]
if copy ~= nil then
return copy
end
if type(orig) == 'table' then
copy = {}
for orig_key, orig_value in pairs(orig) do
copy[_deepCopy(orig_key, includeMetatable, already_seen)] = _deepCopy(orig_value, includeMetatable, already_seen)
end
already_seen[orig] = copy
if includeMetatable then
local mt = getmetatable(orig)
if mt ~= nil then
local mt_copy = _deepCopy(mt, includeMetatable, already_seen)
setmetatable(copy, mt_copy)
already_seen[mt] = mt_copy
end
end
else -- number, string, boolean, etc
copy = orig
end
return copy
end
function p.deepCopy(orig, noMetatable, already_seen)
checkType("deepCopy", 3, already_seen, "table", true)
return _deepCopy(orig, not noMetatable, already_seen)
end
------------------------------------------------------------------------------------
-- sparseConcat
--
-- Concatenates all values in the table that are indexed by a number, in order.
-- sparseConcat{a, nil, c, d} => "acd"
-- sparseConcat{nil, b, c, d} => "bcd"
------------------------------------------------------------------------------------
function p.sparseConcat(t, sep, i, j)
local arr = {}
local arr_i = 0
for _, v in p.sparseIpairs(t) do
arr_i = arr_i + 1
arr[arr_i] = v
end
return table.concat(arr, sep, i, j)
end
------------------------------------------------------------------------------------
-- length
--
-- Finds the length of an array, or of a quasi-array with keys such as "data1",
-- "data2", etc., using an exponential search algorithm. It is similar to the
-- operator #, but may return a different value when there are gaps in the array
-- portion of the table. Intended to be used on data loaded with mw.loadData. For
-- other tables, use #.
-- Note: #frame.args in frame object always be set to 0, regardless of the number
-- of unnamed template parameters, so use this function for frame.args.
------------------------------------------------------------------------------------
function p.length(t, prefix)
-- requiring module inline so that [[Module:Exponential search]] which is
-- only needed by this one function doesn't get millions of transclusions
local expSearch = require("Module:Exponential search")
checkType('length', 1, t, 'table')
checkType('length', 2, prefix, 'string', true)
return expSearch(function (i)
local key
if prefix then
key = prefix .. tostring(i)
else
key = i
end
return t[key] ~= nil
end) or 0
end
------------------------------------------------------------------------------------
-- inArray
--
-- Returns true if valueToFind is a member of the array, and false otherwise.
------------------------------------------------------------------------------------
function p.inArray(arr, valueToFind)
checkType("inArray", 1, arr, "table")
-- if valueToFind is nil, error?
for _, v in ipairs(arr) do
if v == valueToFind then
return true
end
end
return false
end
return p
085e7094ac84eb0132ee65822cf3f69cd8ba3d81
Module:Check for unknown parameters
828
105
169
2022-02-21T05:24:13Z
wikipedia>BusterD
0
Changed protection settings for "[[Module:Check for unknown parameters]]": [[WP:High-risk templates|Highly visible template]]; requested at [[WP:RfPP]] ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite))
Scribunto
text/plain
-- This module may be used to compare the arguments passed to the parent
-- with a list of arguments, returning a specified result if an argument is
-- not on the list
local p = {}
local function trim(s)
return s:match('^%s*(.-)%s*$')
end
local function isnotempty(s)
return s and s:match('%S')
end
local function clean(text)
-- Return text cleaned for display and truncated if too long.
-- Strip markers are replaced with dummy text representing the original wikitext.
local pos, truncated
local function truncate(text)
if truncated then
return ''
end
if mw.ustring.len(text) > 25 then
truncated = true
text = mw.ustring.sub(text, 1, 25) .. '...'
end
return mw.text.nowiki(text)
end
local parts = {}
for before, tag, remainder in text:gmatch('([^\127]*)\127[^\127]*%-(%l+)%-[^\127]*\127()') do
pos = remainder
table.insert(parts, truncate(before) .. '<' .. tag .. '>...</' .. tag .. '>')
end
table.insert(parts, truncate(text:sub(pos or 1)))
return table.concat(parts)
end
function p._check(args, pargs)
if type(args) ~= "table" or type(pargs) ~= "table" then
-- TODO: error handling
return
end
-- create the list of known args, regular expressions, and the return string
local knownargs = {}
local regexps = {}
for k, v in pairs(args) do
if type(k) == 'number' then
v = trim(v)
knownargs[v] = 1
elseif k:find('^regexp[1-9][0-9]*$') then
table.insert(regexps, '^' .. v .. '$')
end
end
-- loop over the parent args, and make sure they are on the list
local ignoreblank = isnotempty(args['ignoreblank'])
local showblankpos = isnotempty(args['showblankpositional'])
local values = {}
for k, v in pairs(pargs) do
if type(k) == 'string' and knownargs[k] == nil then
local knownflag = false
for _, regexp in ipairs(regexps) do
if mw.ustring.match(k, regexp) then
knownflag = true
break
end
end
if not knownflag and ( not ignoreblank or isnotempty(v) ) then
table.insert(values, clean(k))
end
elseif type(k) == 'number' and knownargs[tostring(k)] == nil then
local knownflag = false
for _, regexp in ipairs(regexps) do
if mw.ustring.match(tostring(k), regexp) then
knownflag = true
break
end
end
if not knownflag and ( showblankpos or isnotempty(v) ) then
table.insert(values, k .. ' = ' .. clean(v))
end
end
end
-- add results to the output tables
local res = {}
if #values > 0 then
local unknown_text = args['unknown'] or 'Found _VALUE_, '
if mw.getCurrentFrame():preprocess( "{{REVISIONID}}" ) == "" then
local preview_text = args['preview']
if isnotempty(preview_text) then
preview_text = require('Module:If preview')._warning({preview_text})
elseif preview == nil then
preview_text = unknown_text
end
unknown_text = preview_text
end
for _, v in pairs(values) do
-- Fix odd bug for | = which gets stripped to the empty string and
-- breaks category links
if v == '' then v = ' ' end
-- avoid error with v = 'example%2' ("invalid capture index")
local r = unknown_text:gsub('_VALUE_', {_VALUE_ = v})
table.insert(res, r)
end
end
return table.concat(res)
end
function p.check(frame)
local args = frame.args
local pargs = frame:getParent().args
return p._check(args, pargs)
end
return p
93db6d115d4328d2a5148bb42959105e367b663e
Module:Effective protection expiry
828
59
77
2022-02-23T10:59:29Z
wikipedia>Xaosflux
0
Changed protection settings for "[[Module:Effective protection expiry]]": used in the mediawiki interface / match [[Module:Effective protection level]] ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite))
Scribunto
text/plain
local p = {}
-- Returns the expiry of a restriction of an action on a given title, or unknown if it cannot be known.
-- If no title is specified, the title of the page being displayed is used.
function p._main(action, pagename)
local title
if type(pagename) == 'table' and pagename.prefixedText then
title = pagename
elseif pagename then
title = mw.title.new(pagename)
else
title = mw.title.getCurrentTitle()
end
pagename = title.prefixedText
if action == 'autoreview' then
local stabilitySettings = mw.ext.FlaggedRevs.getStabilitySettings(title)
return stabilitySettings and stabilitySettings.expiry or 'unknown'
elseif action ~= 'edit' and action ~= 'move' and action ~= 'create' and action ~= 'upload' then
error( 'First parameter must be one of edit, move, create, upload, autoreview', 2 )
end
local rawExpiry = mw.getCurrentFrame():callParserFunction('PROTECTIONEXPIRY', action, pagename)
if rawExpiry == 'infinity' then
return 'infinity'
elseif rawExpiry == '' then
return 'unknown'
else
local year, month, day, hour, minute, second = rawExpiry:match(
'^(%d%d%d%d)(%d%d)(%d%d)(%d%d)(%d%d)(%d%d)$'
)
if year then
return string.format(
'%s-%s-%sT%s:%s:%s',
year, month, day, hour, minute, second
)
else
error('internal error in Module:Effective protection expiry; malformed expiry timestamp')
end
end
end
setmetatable(p, { __index = function(t, k)
return function(frame)
return t._main(k, frame.args[1])
end
end })
return p
9a8c58dc2667232ed08a9b206a5d89ca8150312b
Template:Ns has subpages
10
101
161
2022-03-02T10:43:18Z
wikipedia>Trialpears
0
Changed protection settings for "[[Template:Ns has subpages]]": [[WP:High-risk templates|Highly visible template]] ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite))
wikitext
text/x-wiki
{{<includeonly>safesubst:</includeonly>#invoke:Ns has subpages|main}}<noinclude>
{{documentation}}
<!-- Categories go on the /doc subpage and interwikis go on Wikidata. -->
</noinclude>
060d2d01af26cb67fd90a7c346a0d2d5e450a040
Module:Template link general
828
107
173
2022-03-08T08:30:51Z
wikipedia>Primefac
0
update from sandbox - fixes to _show_result and adding _expand
Scribunto
text/plain
-- This implements Template:Tlg
local getArgs = require('Module:Arguments').getArgs
local p = {}
-- Is a string non-empty?
local function _ne(s)
return s ~= nil and s ~= ""
end
local nw = mw.text.nowiki
local function addTemplate(s)
local i, _ = s:find(':', 1, true)
if i == nil then
return 'Template:' .. s
end
local ns = s:sub(1, i - 1)
if ns == '' or mw.site.namespaces[ns] then
return s
else
return 'Template:' .. s
end
end
local function trimTemplate(s)
local needle = 'template:'
if s:sub(1, needle:len()):lower() == needle then
return s:sub(needle:len() + 1)
else
return s
end
end
local function linkTitle(args)
if _ne(args.nolink) then
return args['1']
end
local titleObj
local titlePart = '[['
if args['1'] then
-- This handles :Page and other NS
titleObj = mw.title.new(args['1'], 'Template')
else
titleObj = mw.title.getCurrentTitle()
end
titlePart = titlePart .. (titleObj ~= nil and titleObj.fullText or
addTemplate(args['1']))
local textPart = args.alttext
if not _ne(textPart) then
if titleObj ~= nil then
textPart = titleObj:inNamespace("Template") and args['1'] or titleObj.fullText
else
-- redlink
textPart = args['1']
end
end
if _ne(args.subst) then
-- HACK: the ns thing above is probably broken
textPart = 'subst:' .. textPart
end
if _ne(args.brace) then
textPart = nw('{{') .. textPart .. nw('}}')
elseif _ne(args.braceinside) then
textPart = nw('{') .. textPart .. nw('}')
end
titlePart = titlePart .. '|' .. textPart .. ']]'
if _ne(args.braceinside) then
titlePart = nw('{') .. titlePart .. nw('}')
end
return titlePart
end
function p.main(frame)
local args = getArgs(frame, {
trim = true,
removeBlanks = false
})
return p._main(args)
end
function p._main(args)
local bold = _ne(args.bold) or _ne(args.boldlink) or _ne(args.boldname)
local italic = _ne(args.italic) or _ne(args.italics)
local dontBrace = _ne(args.brace) or _ne(args.braceinside)
local code = _ne(args.code) or _ne(args.tt)
local show_result = _ne(args._show_result)
local expand = _ne(args._expand)
-- Build the link part
local titlePart = linkTitle(args)
if bold then titlePart = "'''" .. titlePart .. "'''" end
if _ne(args.nowrapname) then titlePart = '<span class="nowrap">' .. titlePart .. '</span>' end
-- Build the arguments
local textPart = ""
local textPartBuffer = "|"
local codeArguments = {}
local codeArgumentsString = ""
local i = 2
local j = 1
while args[i] do
local val = args[i]
if val ~= "" then
if _ne(args.nowiki) then
-- Unstrip nowiki tags first because calling nw on something that already contains nowiki tags will
-- mangle the nowiki strip marker and result in literal UNIQ...QINU showing up
val = nw(mw.text.unstripNoWiki(val))
end
local k, v = string.match(val, "(.*)=(.*)")
if not k then
codeArguments[j] = val
j = j + 1
else
codeArguments[k] = v
end
codeArgumentsString = codeArgumentsString .. textPartBuffer .. val
if italic then
val = '<span style="font-style:italic;">' .. val .. '</span>'
end
textPart = textPart .. textPartBuffer .. val
end
i = i + 1
end
-- final wrap
local ret = titlePart .. textPart
if not dontBrace then ret = nw('{{') .. ret .. nw('}}') end
if _ne(args.a) then ret = nw('*') .. ' ' .. ret end
if _ne(args.kbd) then ret = '<kbd>' .. ret .. '</kbd>' end
if code then
ret = '<code>' .. ret .. '</code>'
elseif _ne(args.plaincode) then
ret = '<code style="border:none;background:transparent;">' .. ret .. '</code>'
end
if _ne(args.nowrap) then ret = '<span class="nowrap">' .. ret .. '</span>' end
--[[ Wrap as html??
local span = mw.html.create('span')
span:wikitext(ret)
--]]
if _ne(args.debug) then ret = ret .. '\n<pre>' .. mw.text.encode(mw.dumpObject(args)) .. '</pre>' end
if show_result then
local result = mw.getCurrentFrame():expandTemplate{title = addTemplate(args[1]), args = codeArguments}
ret = ret .. " → " .. result
end
if expand then
local query = mw.text.encode('{{' .. addTemplate(args[1]) .. string.gsub(codeArgumentsString, textPartBuffer, "|") .. '}}')
local url = mw.uri.fullUrl('special:ExpandTemplates', 'wpInput=' .. query)
mw.log()
ret = ret .. " [" .. tostring(url) .. "]"
end
return ret
end
return p
c7307fa3959d308a2dd7fd2f5009c1ce6db3d122
Template:Documentation
10
128
215
2022-03-29T02:14:34Z
wikipedia>Bsherr
0
consistent with new substitution template format
wikitext
text/x-wiki
{{#invoke:documentation|main|_content={{ {{#invoke:documentation|contentTitle}}}}}}<noinclude>
<!-- Add categories to the /doc subpage -->
</noinclude>
9e62b964e96c4e3d478edecbfcb3c0338ae8a276
Module:Labelled list hatnote
828
115
189
2022-06-08T23:33:35Z
wikipedia>Nihiltres
0
Fixed iteration-and-removal bug
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Labelled list --
-- --
-- This module does the core work of creating a hatnote composed of a list --
-- prefixed by a colon-terminated label, i.e. "LABEL: [andList of pages]", --
-- for {{see also}} and similar templates. --
--------------------------------------------------------------------------------
local mHatnote = require('Module:Hatnote')
local mHatlist = require('Module:Hatnote list')
local mArguments --initialize lazily
local yesno --initialize lazily
local p = {}
-- Defaults global to this module
local defaults = {
label = 'See also', --Final fallback for label argument
labelForm = '%s: %s',
prefixes = {'label', 'label ', 'l'},
template = 'Module:Labelled list hatnote'
}
-- Localizable message strings
local msg = {
errorSuffix = '#Errors',
noInputWarning = 'no page names specified',
noOutputWarning =
"'''[[%s]] — no output: none of the target pages exist.'''"
}
-- Helper function that pre-combines display parameters into page arguments.
-- Also compresses sparse arrays, as a desirable side-effect.
function p.preprocessDisplays (args, prefixes)
-- Prefixes specify which parameters, in order, to check for display options
-- They each have numbers auto-appended, e.g. 'label1', 'label 1', & 'l1'
prefixes = prefixes or defaults.prefixes
local indices = {}
local sparsePages = {}
for k, v in pairs(args) do
if type(k) == 'number' then
indices[#indices + 1] = k
local display
for i = 1, #prefixes do
display = args[prefixes[i] .. k]
if display then break end
end
sparsePages[k] = display and
string.format('%s|%s', string.gsub(v, '|.*$', ''), display) or v
end
end
table.sort(indices)
local pages = {}
for k, v in ipairs(indices) do pages[#pages + 1] = sparsePages[v] end
return pages
end
--Helper function to get a page target from a processed page string
--e.g. "Page|Label" → "Page" or "Target" → "Target"
local function getTarget(pagename)
local pipe = string.find(pagename, '|')
return string.sub(pagename, 0, pipe and pipe - 1 or nil)
end
-- Produces a labelled pages-list hatnote.
-- The main frame (template definition) takes 1 or 2 arguments, for a singular
-- and (optionally) plural label respectively:
-- * {{#invoke:Labelled list hatnote|labelledList|Singular label|Plural label}}
-- The resulting template takes pagename & label parameters normally.
function p.labelledList (frame)
mArguments = require('Module:Arguments')
yesno = require('Module:Yesno')
local labels = {frame.args[1] or defaults.label}
labels[2] = frame.args[2] or labels[1]
labels[3] = frame.args[3] --no defaulting
labels[4] = frame.args[4] --no defaulting
local template = frame:getParent():getTitle()
local args = mArguments.getArgs(frame, {parentOnly = true})
local pages = p.preprocessDisplays(args)
local options = {
category = yesno(args.category),
extraclasses = frame.args.extraclasses,
ifexists = yesno(frame.args.ifexists),
namespace = frame.args.namespace or args.namespace,
selfref = yesno(frame.args.selfref or args.selfref),
template = template
}
return p._labelledList(pages, labels, options)
end
function p._labelledList (pages, labels, options)
if options.ifexists then
for k = #pages, 1, -1 do --iterate backwards to allow smooth removals
local v = pages[k]
local title = mw.title.new(getTarget(v), namespace)
if (v == '') or title == nil or not title.exists then
table.remove(pages, k)
end
end
end
labels = labels or {}
label = (#pages == 1 and labels[1] or labels[2]) or defaults.label
for k, v in pairs(pages) do
if mHatnote.findNamespaceId(v) ~= 0 then
label =
(
#pages == 1 and
(labels[3] or labels[1] or defaults.label) or
(labels[4] or labels[2] or defaults.label)
) or defaults.label
end
end
if #pages == 0 then
if options.ifexists then
mw.addWarning(
string.format(
msg.noOutputWarning, options.template or defaults.template
)
)
return ''
else
return mHatnote.makeWikitextError(
msg.noInputWarning,
(options.template or defaults.template) .. msg.errorSuffix,
options.category
)
end
end
local text = string.format(
options.labelForm or defaults.labelForm,
label,
mHatlist.andList(pages, true)
)
local hnOptions = {
extraclasses = options.extraclasses,
selfref = options.selfref
}
return mHatnote._hatnote(text, hnOptions)
end
return p
b7a8ba27cf6195e6427701b94e8d2acad3c40a21
Module:Uses TemplateStyles/config
828
92
143
2022-06-16T15:10:06Z
wikipedia>Pppery
0
Matching reality rather than 2018 me's wishful thinking
Scribunto
text/plain
local cfg = {} -- Don’t touch this line.
-- Subpage blacklist: these subpages will not be categorized (except for the
-- error category, which is always added if there is an error).
-- For example “Template:Foo/doc” matches the `doc = true` rule, so it will have
-- no categories. “Template:Foo” and “Template:Foo/documentation” match no rules,
-- so they *will* have categories. All rules should be in the
-- ['<subpage name>'] = true,
-- format.
cfg['subpage_blacklist'] = {
['doc'] = true,
['sandbox'] = true,
['sandbox2'] = true,
['testcases'] = true,
}
-- Sandbox title: if the stylesheet’s title is <template>/<stylesheet>.css, the
-- stylesheet’s sandbox is expected to be at <template>/<sandbox_title>/<stylesheet>.css
-- Set to nil to disable sandbox links.
cfg['sandbox_title'] = 'sandbox'
-- Error category: this category is added if the module call contains errors
-- (e.g. no stylesheet listed). A category name without namespace, or nil
-- to disable categorization (not recommended).
cfg['error_category'] = 'Uses TemplateStyles templates with errors'
-- Default category: this category is added if no custom category is specified
-- in module/template call. A category name without namespace, or nil
-- to disable categorization.
cfg['default_category'] = 'Templates using TemplateStyles'
-- Protection conflict category: this category is added if the protection level
-- of any stylesheet is lower than the protection level of the template. A category name
-- without namespace, or nil to disable categorization (not recommended).
cfg['protection_conflict_category'] = 'Templates using TemplateStyles with a different protection level'
-- Hierarchy of protection levels, used to determine whether one protection level is lower
-- than another and thus should populate protection_conflict_category. No protection is treated as zero
cfg['protection_hierarchy'] = {
autoconfirmed = 1,
extendedconfirmed = 2,
templateeditor = 3,
sysop = 4
}
-- Padlock pattern: Lua pattern to search on protected stylesheets for, or nil
-- to disable padlock check.
cfg['padlock_pattern'] = '{{pp-'
-- Missing padlock category: this category is added if a protected stylesheet
-- doesn’t contain any padlock template (specified by the above Lua pattern).
-- A category name without namespace (no nil allowed) if the pattern is not nil,
-- unused (and thus may be nil) otherwise.
cfg['missing_padlock_category'] = 'Templates using TemplateStyles without padlocks'
return cfg -- Don’t touch this line.
58e7a37c44f6ea3f6b8af54a559d696cc7256493
Module:Uses TemplateStyles
828
91
141
2022-06-16T15:13:38Z
wikipedia>Pppery
0
Matching reality rather than 2018 me's wishful thinking
Scribunto
text/plain
local yesno = require('Module:Yesno')
local mList = require('Module:List')
local mTableTools = require('Module:TableTools')
local mMessageBox = require('Module:Message box')
local TNT = require('Module:TNT')
local p = {}
local function format(msg, ...)
return TNT.format('I18n/Uses TemplateStyles', msg, ...)
end
local function getConfig()
return mw.loadData('Module:Uses TemplateStyles/config')
end
local function renderBox(tStyles)
local boxArgs = {
type = 'notice',
small = true,
image = string.format('[[File:Farm-Fresh css add.svg|32px|alt=%s]]', format('logo-alt'))
}
if #tStyles < 1 then
boxArgs.text = string.format('<strong class="error">%s</strong>', format('error-emptylist'))
else
local cfg = getConfig()
local tStylesLinks = {}
for i, ts in ipairs(tStyles) do
local link = string.format('[[:%s]]', ts)
local sandboxLink = nil
local tsTitle = mw.title.new(ts)
if tsTitle and cfg['sandbox_title'] then
local tsSandboxTitle = mw.title.new(string.format(
'%s:%s/%s/%s', tsTitle.nsText, tsTitle.baseText, cfg['sandbox_title'], tsTitle.subpageText))
if tsSandboxTitle and tsSandboxTitle.exists then
sandboxLink = format('sandboxlink', link, ':' .. tsSandboxTitle.prefixedText)
end
end
tStylesLinks[i] = sandboxLink or link
end
local tStylesList = mList.makeList('bulleted', tStylesLinks)
boxArgs.text = format(
mw.title.getCurrentTitle():inNamespaces(828,829) and 'header-module' or 'header-template') ..
'\n' .. tStylesList
end
return mMessageBox.main('mbox', boxArgs)
end
local function renderTrackingCategories(args, tStyles, titleObj)
if yesno(args.nocat) then
return ''
end
local cfg = getConfig()
local cats = {}
-- Error category
if #tStyles < 1 and cfg['error_category'] then
cats[#cats + 1] = cfg['error_category']
end
-- TemplateStyles category
titleObj = titleObj or mw.title.getCurrentTitle()
if (titleObj.namespace == 10 or titleObj.namespace == 828)
and not cfg['subpage_blacklist'][titleObj.subpageText]
then
local category = args.category or cfg['default_category']
if category then
cats[#cats + 1] = category
end
if not yesno(args.noprotcat) and (cfg['protection_conflict_category'] or cfg['padlock_pattern']) then
local currentProt = titleObj.protectionLevels["edit"] and titleObj.protectionLevels["edit"][1] or nil
local addedLevelCat = false
local addedPadlockCat = false
for i, ts in ipairs(tStyles) do
local tsTitleObj = mw.title.new(ts)
local tsProt = tsTitleObj.protectionLevels["edit"] and tsTitleObj.protectionLevels["edit"][1] or nil
if cfg['padlock_pattern'] and tsProt and not addedPadlockCat then
local content = tsTitleObj:getContent()
if not content:find(cfg['padlock_pattern']) then
cats[#cats + 1] = cfg['missing_padlock_category']
addedPadlockCat = true
end
end
if cfg['protection_conflict_category'] and currentProt and tsProt ~= currentProt and not addedLevelCat then
currentProt = cfg['protection_hierarchy'][currentProt] or 0
tsProt = cfg['protection_hierarchy'][tsProt] or 0
if tsProt < currentProt then
addedLevelCat = true
cats[#cats + 1] = cfg['protection_conflict_category']
end
end
end
end
end
for i, cat in ipairs(cats) do
cats[i] = string.format('[[Category:%s]]', cat)
end
return table.concat(cats)
end
function p._main(args, cfg)
local tStyles = mTableTools.compressSparseArray(args)
local box = renderBox(tStyles)
local trackingCategories = renderTrackingCategories(args, tStyles)
return box .. trackingCategories
end
function p.main(frame)
local origArgs = frame:getParent().args
local args = {}
for k, v in pairs(origArgs) do
v = v:match('^%s*(.-)%s*$')
if v ~= '' then
args[k] = v
end
end
return p._main(args)
end
return p
71ca57c37849f38e3c5ee30061bdae730963e48e
Module:Message box/ombox.css
828
94
147
2022-07-11T18:40:17Z
wikipedia>Izno
0
and move mbox-small to 720px here as well
sanitized-css
text/css
/* {{pp|small=y}} */
.ombox {
margin: 4px 0;
border-collapse: collapse;
border: 1px solid #a2a9b1; /* Default "notice" gray */
background-color: #f8f9fa;
box-sizing: border-box;
}
/* For the "small=yes" option. */
.ombox.mbox-small {
font-size: 88%;
line-height: 1.25em;
}
.ombox-speedy {
border: 2px solid #b32424; /* Red */
background-color: #fee7e6; /* Pink */
}
.ombox-delete {
border: 2px solid #b32424; /* Red */
}
.ombox-content {
border: 1px solid #f28500; /* Orange */
}
.ombox-style {
border: 1px solid #fc3; /* Yellow */
}
.ombox-move {
border: 1px solid #9932cc; /* Purple */
}
.ombox-protection {
border: 2px solid #a2a9b1; /* Gray-gold */
}
.ombox .mbox-text {
border: none;
/* @noflip */
padding: 0.25em 0.9em;
width: 100%;
}
.ombox .mbox-image {
border: none;
/* @noflip */
padding: 2px 0 2px 0.9em;
text-align: center;
}
.ombox .mbox-imageright {
border: none;
/* @noflip */
padding: 2px 0.9em 2px 0;
text-align: center;
}
/* An empty narrow cell */
.ombox .mbox-empty-cell {
border: none;
padding: 0;
width: 1px;
}
.ombox .mbox-invalid-type {
text-align: center;
}
@media (min-width: 720px) {
.ombox {
margin: 4px 10%;
}
.ombox.mbox-small {
/* @noflip */
clear: right;
/* @noflip */
float: right;
/* @noflip */
margin: 4px 0 4px 1em;
width: 238px;
}
}
8fe3df4bb607e699eab2dbd23bd4a1a446391002
Template:Para
10
125
209
2022-07-22T08:06:17Z
wikipedia>TheDJ
0
breakup super long words, so we do not overflow the viewport.
wikitext
text/x-wiki
<code class="tpl-para" style="word-break:break-word;{{SAFESUBST:<noinclude />#if:{{{plain|}}}|border: none; background-color: inherit;}} {{SAFESUBST:<noinclude />#if:{{{plain|}}}{{{mxt|}}}{{{green|}}}{{{!mxt|}}}{{{red|}}}|color: {{SAFESUBST:<noinclude />#if:{{{mxt|}}}{{{green|}}}|#006400|{{SAFESUBST:<noinclude />#if:{{{!mxt|}}}{{{red|}}}|#8B0000|inherit}}}};}} {{SAFESUBST:<noinclude />#if:{{{style|}}}|{{{style}}}}}">|{{SAFESUBST:<noinclude />#if:{{{1|}}}|{{{1}}}=}}{{{2|}}}</code><noinclude>
{{Documentation}}
<!--Categories and interwikis go near the bottom of the /doc subpage.-->
</noinclude>
06006deea2ed5d552aab61b4332321ab749ae7e8
Module:Hatnote
828
112
183
2022-09-05T18:18:32Z
wikipedia>Nihiltres
0
Reordered helper functions (first by export status, then alphabetically) and migrated p.quote upstream from [[Module:Redirect hatnote]] (includes contributions by Tamzin and Nihiltres)
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Module:Hatnote --
-- --
-- This module produces hatnote links and links to related articles. It --
-- implements the {{hatnote}} and {{format link}} meta-templates and includes --
-- helper functions for other Lua hatnote modules. --
--------------------------------------------------------------------------------
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg
local mArguments -- lazily initialise [[Module:Arguments]]
local yesno -- lazily initialise [[Module:Yesno]]
local formatLink -- lazily initialise [[Module:Format link]] ._formatLink
local p = {}
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function getArgs(frame)
-- Fetches the arguments from the parent frame. Whitespace is trimmed and
-- blanks are removed.
mArguments = require('Module:Arguments')
return mArguments.getArgs(frame, {parentOnly = true})
end
local function removeInitialColon(s)
-- Removes the initial colon from a string, if present.
return s:match('^:?(.*)')
end
function p.defaultClasses(inline)
-- Provides the default hatnote classes as a space-separated string; useful
-- for hatnote-manipulation modules like [[Module:Hatnote group]].
return
(inline == 1 and 'hatnote-inline' or 'hatnote') .. ' ' ..
'navigation-not-searchable'
end
function p.disambiguate(page, disambiguator)
-- Formats a page title with a disambiguation parenthetical,
-- i.e. "Example" → "Example (disambiguation)".
checkType('disambiguate', 1, page, 'string')
checkType('disambiguate', 2, disambiguator, 'string', true)
disambiguator = disambiguator or 'disambiguation'
return mw.ustring.format('%s (%s)', page, disambiguator)
end
function p.findNamespaceId(link, removeColon)
-- Finds the namespace id (namespace number) of a link or a pagename. This
-- function will not work if the link is enclosed in double brackets. Colons
-- are trimmed from the start of the link by default. To skip colon
-- trimming, set the removeColon parameter to false.
checkType('findNamespaceId', 1, link, 'string')
checkType('findNamespaceId', 2, removeColon, 'boolean', true)
if removeColon ~= false then
link = removeInitialColon(link)
end
local namespace = link:match('^(.-):')
if namespace then
local nsTable = mw.site.namespaces[namespace]
if nsTable then
return nsTable.id
end
end
return 0
end
function p.makeWikitextError(msg, helpLink, addTrackingCategory, title)
-- Formats an error message to be returned to wikitext. If
-- addTrackingCategory is not false after being returned from
-- [[Module:Yesno]], and if we are not on a talk page, a tracking category
-- is added.
checkType('makeWikitextError', 1, msg, 'string')
checkType('makeWikitextError', 2, helpLink, 'string', true)
yesno = require('Module:Yesno')
title = title or mw.title.getCurrentTitle()
-- Make the help link text.
local helpText
if helpLink then
helpText = ' ([[' .. helpLink .. '|help]])'
else
helpText = ''
end
-- Make the category text.
local category
if not title.isTalkPage -- Don't categorise talk pages
and title.namespace ~= 2 -- Don't categorise userspace
and yesno(addTrackingCategory) ~= false -- Allow opting out
then
category = 'Hatnote templates with errors'
category = mw.ustring.format(
'[[%s:%s]]',
mw.site.namespaces[14].name,
category
)
else
category = ''
end
return mw.ustring.format(
'<strong class="error">Error: %s%s.</strong>%s',
msg,
helpText,
category
)
end
local curNs = mw.title.getCurrentTitle().namespace
p.missingTargetCat =
--Default missing target category, exported for use in related modules
((curNs == 0) or (curNs == 14)) and
'Articles with hatnote templates targeting a nonexistent page' or nil
function p.quote(title)
--Wraps titles in quotation marks. If the title starts/ends with a quotation
--mark, kerns that side as with {{-'}}
local quotationMarks = {
["'"]=true, ['"']=true, ['“']=true, ["‘"]=true, ['”']=true, ["’"]=true
}
local quoteLeft, quoteRight = -- Test if start/end are quotation marks
quotationMarks[string.sub(title, 1, 1)],
quotationMarks[string.sub(title, -1, -1)]
if quoteLeft or quoteRight then
title = mw.html.create("span"):wikitext(title)
end
if quoteLeft then title:css("padding-left", "0.15em") end
if quoteRight then title:css("padding-right", "0.15em") end
return '"' .. tostring(title) .. '"'
end
--------------------------------------------------------------------------------
-- Hatnote
--
-- Produces standard hatnote text. Implements the {{hatnote}} template.
--------------------------------------------------------------------------------
function p.hatnote(frame)
local args = getArgs(frame)
local s = args[1]
if not s then
return p.makeWikitextError(
'no text specified',
'Template:Hatnote#Errors',
args.category
)
end
return p._hatnote(s, {
extraclasses = args.extraclasses,
selfref = args.selfref
})
end
function p._hatnote(s, options)
checkType('_hatnote', 1, s, 'string')
checkType('_hatnote', 2, options, 'table', true)
options = options or {}
local inline = options.inline
local hatnote = mw.html.create(inline == 1 and 'span' or 'div')
local extraclasses
if type(options.extraclasses) == 'string' then
extraclasses = options.extraclasses
end
hatnote
:attr('role', 'note')
:addClass(p.defaultClasses(inline))
:addClass(extraclasses)
:addClass(options.selfref and 'selfref' or nil)
:wikitext(s)
return mw.getCurrentFrame():extensionTag{
name = 'templatestyles', args = { src = 'Module:Hatnote/styles.css' }
} .. tostring(hatnote)
end
return p
3ae1ed7094c5005ca0896395ec9a587287a0bef1
Module:Format link
828
111
181
2022-10-04T13:37:11Z
wikipedia>Pppery
0
Avoid Lua erroring when we run out of expensive parser function calls
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Format link
--
-- Makes a wikilink from the given link and display values. Links are escaped
-- with colons if necessary, and links to sections are detected and displayed
-- with " § " as a separator rather than the standard MediaWiki "#". Used in
-- the {{format link}} template.
--------------------------------------------------------------------------------
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg
local mArguments -- lazily initialise [[Module:Arguments]]
local mError -- lazily initialise [[Module:Error]]
local yesno -- lazily initialise [[Module:Yesno]]
local p = {}
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function getArgs(frame)
-- Fetches the arguments from the parent frame. Whitespace is trimmed and
-- blanks are removed.
mArguments = require('Module:Arguments')
return mArguments.getArgs(frame, {parentOnly = true})
end
local function removeInitialColon(s)
-- Removes the initial colon from a string, if present.
return s:match('^:?(.*)')
end
local function maybeItalicize(s, shouldItalicize)
-- Italicize s if s is a string and the shouldItalicize parameter is true.
if s and shouldItalicize then
return '<i>' .. s .. '</i>'
else
return s
end
end
local function parseLink(link)
-- Parse a link and return a table with the link's components.
-- These components are:
-- - link: the link, stripped of any initial colon (always present)
-- - page: the page name (always present)
-- - section: the page name (may be nil)
-- - display: the display text, if manually entered after a pipe (may be nil)
link = removeInitialColon(link)
-- Find whether a faux display value has been added with the {{!}} magic
-- word.
local prePipe, display = link:match('^(.-)|(.*)$')
link = prePipe or link
-- Find the page, if it exists.
-- For links like [[#Bar]], the page will be nil.
local preHash, postHash = link:match('^(.-)#(.*)$')
local page
if not preHash then
-- We have a link like [[Foo]].
page = link
elseif preHash ~= '' then
-- We have a link like [[Foo#Bar]].
page = preHash
end
-- Find the section, if it exists.
local section
if postHash and postHash ~= '' then
section = postHash
end
return {
link = link,
page = page,
section = section,
display = display,
}
end
local function formatDisplay(parsed, options)
-- Formats a display string based on a parsed link table (matching the
-- output of parseLink) and an options table (matching the input options for
-- _formatLink).
local page = maybeItalicize(parsed.page, options.italicizePage)
local section = maybeItalicize(parsed.section, options.italicizeSection)
if (not section) then
return page
elseif (not page) then
return mw.ustring.format('§ %s', section)
else
return mw.ustring.format('%s § %s', page, section)
end
end
local function missingArgError(target)
mError = require('Module:Error')
return mError.error{message =
'Error: no link or target specified! ([[' .. target .. '#Errors|help]])'
}
end
--------------------------------------------------------------------------------
-- Main functions
--------------------------------------------------------------------------------
function p.formatLink(frame)
-- The formatLink export function, for use in templates.
yesno = require('Module:Yesno')
local args = getArgs(frame)
local link = args[1] or args.link
local target = args[3] or args.target
if not (link or target) then
return missingArgError('Template:Format link')
end
return p._formatLink{
link = link,
display = args[2] or args.display,
target = target,
italicizePage = yesno(args.italicizepage),
italicizeSection = yesno(args.italicizesection),
categorizeMissing = args.categorizemissing
}
end
function p._formatLink(options)
-- The formatLink export function, for use in modules.
checkType('_formatLink', 1, options, 'table')
local function check(key, expectedType) --for brevity
checkTypeForNamedArg(
'_formatLink', key, options[key], expectedType or 'string', true
)
end
check('link')
check('display')
check('target')
check('italicizePage', 'boolean')
check('italicizeSection', 'boolean')
check('categorizeMissing')
-- Normalize link and target and check that at least one is present
if options.link == '' then options.link = nil end
if options.target == '' then options.target = nil end
if not (options.link or options.target) then
return missingArgError('Module:Format link')
end
local parsed = parseLink(options.link)
local display = options.display or parsed.display
local catMissing = options.categorizeMissing
local category = ''
-- Find the display text
if not display then display = formatDisplay(parsed, options) end
-- Handle the target option if present
if options.target then
local parsedTarget = parseLink(options.target)
parsed.link = parsedTarget.link
parsed.page = parsedTarget.page
end
-- Test if page exists if a diagnostic category is specified
if catMissing and (mw.ustring.len(catMissing) > 0) then
local title = nil
if parsed.page then title = mw.title.new(parsed.page) end
if title and (not title.isExternal) then
local success, exists = pcall(function() return title.exists end)
if success and not exists then
category = mw.ustring.format('[[Category:%s]]', catMissing)
end
end
end
-- Format the result as a link
if parsed.link == display then
return mw.ustring.format('[[:%s]]%s', parsed.link, category)
else
return mw.ustring.format('[[:%s|%s]]%s', parsed.link, display, category)
end
end
--------------------------------------------------------------------------------
-- Derived convenience functions
--------------------------------------------------------------------------------
function p.formatPages(options, pages)
-- Formats an array of pages using formatLink and the given options table,
-- and returns it as an array. Nil values are not allowed.
local ret = {}
for i, page in ipairs(pages) do
ret[i] = p._formatLink{
link = page,
categorizeMissing = options.categorizeMissing,
italicizePage = options.italicizePage,
italicizeSection = options.italicizeSection
}
end
return ret
end
return p
1253bdd2683ee4badc33856bfd5499b09a7dca1f
Module:Protection banner
828
66
91
2022-10-21T08:07:11Z
wikipedia>WOSlinker
0
use require('strict') instead of require('Module:No globals')
Scribunto
text/plain
-- This module implements {{pp-meta}} and its daughter templates such as
-- {{pp-dispute}}, {{pp-vandalism}} and {{pp-sock}}.
-- Initialise necessary modules.
require('strict')
local makeFileLink = require('Module:File link')._main
local effectiveProtectionLevel = require('Module:Effective protection level')._main
local effectiveProtectionExpiry = require('Module:Effective protection expiry')._main
local yesno = require('Module:Yesno')
-- Lazily initialise modules and objects we don't always need.
local getArgs, makeMessageBox, lang
-- Set constants.
local CONFIG_MODULE = 'Module:Protection banner/config'
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function makeCategoryLink(cat, sort)
if cat then
return string.format(
'[[%s:%s|%s]]',
mw.site.namespaces[14].name,
cat,
sort
)
end
end
-- Validation function for the expiry and the protection date
local function validateDate(dateString, dateType)
if not lang then
lang = mw.language.getContentLanguage()
end
local success, result = pcall(lang.formatDate, lang, 'U', dateString)
if success then
result = tonumber(result)
if result then
return result
end
end
error(string.format(
'invalid %s: %s',
dateType,
tostring(dateString)
), 4)
end
local function makeFullUrl(page, query, display)
return string.format(
'[%s %s]',
tostring(mw.uri.fullUrl(page, query)),
display
)
end
-- Given a directed graph formatted as node -> table of direct successors,
-- get a table of all nodes reachable from a given node (though always
-- including the given node).
local function getReachableNodes(graph, start)
local toWalk, retval = {[start] = true}, {}
while true do
-- Can't use pairs() since we're adding and removing things as we're iterating
local k = next(toWalk) -- This always gets the "first" key
if k == nil then
return retval
end
toWalk[k] = nil
retval[k] = true
for _,v in ipairs(graph[k]) do
if not retval[v] then
toWalk[v] = true
end
end
end
end
--------------------------------------------------------------------------------
-- Protection class
--------------------------------------------------------------------------------
local Protection = {}
Protection.__index = Protection
Protection.supportedActions = {
edit = true,
move = true,
autoreview = true,
upload = true
}
Protection.bannerConfigFields = {
'text',
'explanation',
'tooltip',
'alt',
'link',
'image'
}
function Protection.new(args, cfg, title)
local obj = {}
obj._cfg = cfg
obj.title = title or mw.title.getCurrentTitle()
-- Set action
if not args.action then
obj.action = 'edit'
elseif Protection.supportedActions[args.action] then
obj.action = args.action
else
error(string.format(
'invalid action: %s',
tostring(args.action)
), 3)
end
-- Set level
obj.level = args.demolevel or effectiveProtectionLevel(obj.action, obj.title)
if not obj.level or (obj.action == 'move' and obj.level == 'autoconfirmed') then
-- Users need to be autoconfirmed to move pages anyway, so treat
-- semi-move-protected pages as unprotected.
obj.level = '*'
end
-- Set expiry
local effectiveExpiry = effectiveProtectionExpiry(obj.action, obj.title)
if effectiveExpiry == 'infinity' then
obj.expiry = 'indef'
elseif effectiveExpiry ~= 'unknown' then
obj.expiry = validateDate(effectiveExpiry, 'expiry date')
end
-- Set reason
if args[1] then
obj.reason = mw.ustring.lower(args[1])
if obj.reason:find('|') then
error('reasons cannot contain the pipe character ("|")', 3)
end
end
-- Set protection date
if args.date then
obj.protectionDate = validateDate(args.date, 'protection date')
end
-- Set banner config
do
obj.bannerConfig = {}
local configTables = {}
if cfg.banners[obj.action] then
configTables[#configTables + 1] = cfg.banners[obj.action][obj.reason]
end
if cfg.defaultBanners[obj.action] then
configTables[#configTables + 1] = cfg.defaultBanners[obj.action][obj.level]
configTables[#configTables + 1] = cfg.defaultBanners[obj.action].default
end
configTables[#configTables + 1] = cfg.masterBanner
for i, field in ipairs(Protection.bannerConfigFields) do
for j, t in ipairs(configTables) do
if t[field] then
obj.bannerConfig[field] = t[field]
break
end
end
end
end
return setmetatable(obj, Protection)
end
function Protection:isUserScript()
-- Whether the page is a user JavaScript or CSS page.
local title = self.title
return title.namespace == 2 and (
title.contentModel == 'javascript' or title.contentModel == 'css'
)
end
function Protection:isProtected()
return self.level ~= '*'
end
function Protection:shouldShowLock()
-- Whether we should output a banner/padlock
return self:isProtected() and not self:isUserScript()
end
-- Whether this page needs a protection category.
Protection.shouldHaveProtectionCategory = Protection.shouldShowLock
function Protection:isTemporary()
return type(self.expiry) == 'number'
end
function Protection:makeProtectionCategory()
if not self:shouldHaveProtectionCategory() then
return ''
end
local cfg = self._cfg
local title = self.title
-- Get the expiry key fragment.
local expiryFragment
if self.expiry == 'indef' then
expiryFragment = self.expiry
elseif type(self.expiry) == 'number' then
expiryFragment = 'temp'
end
-- Get the namespace key fragment.
local namespaceFragment = cfg.categoryNamespaceKeys[title.namespace]
if not namespaceFragment and title.namespace % 2 == 1 then
namespaceFragment = 'talk'
end
-- Define the order that key fragments are tested in. This is done with an
-- array of tables containing the value to be tested, along with its
-- position in the cfg.protectionCategories table.
local order = {
{val = expiryFragment, keypos = 1},
{val = namespaceFragment, keypos = 2},
{val = self.reason, keypos = 3},
{val = self.level, keypos = 4},
{val = self.action, keypos = 5}
}
--[[
-- The old protection templates used an ad-hoc protection category system,
-- with some templates prioritising namespaces in their categories, and
-- others prioritising the protection reason. To emulate this in this module
-- we use the config table cfg.reasonsWithNamespacePriority to set the
-- reasons for which namespaces have priority over protection reason.
-- If we are dealing with one of those reasons, move the namespace table to
-- the end of the order table, i.e. give it highest priority. If not, the
-- reason should have highest priority, so move that to the end of the table
-- instead.
--]]
table.insert(order, table.remove(order, self.reason and cfg.reasonsWithNamespacePriority[self.reason] and 2 or 3))
--[[
-- Define the attempt order. Inactive subtables (subtables with nil "value"
-- fields) are moved to the end, where they will later be given the key
-- "all". This is to cut down on the number of table lookups in
-- cfg.protectionCategories, which grows exponentially with the number of
-- non-nil keys. We keep track of the number of active subtables with the
-- noActive parameter.
--]]
local noActive, attemptOrder
do
local active, inactive = {}, {}
for i, t in ipairs(order) do
if t.val then
active[#active + 1] = t
else
inactive[#inactive + 1] = t
end
end
noActive = #active
attemptOrder = active
for i, t in ipairs(inactive) do
attemptOrder[#attemptOrder + 1] = t
end
end
--[[
-- Check increasingly generic key combinations until we find a match. If a
-- specific category exists for the combination of key fragments we are
-- given, that match will be found first. If not, we keep trying different
-- key fragment combinations until we match using the key
-- "all-all-all-all-all".
--
-- To generate the keys, we index the key subtables using a binary matrix
-- with indexes i and j. j is only calculated up to the number of active
-- subtables. For example, if there were three active subtables, the matrix
-- would look like this, with 0 corresponding to the key fragment "all", and
-- 1 corresponding to other key fragments.
--
-- j 1 2 3
-- i
-- 1 1 1 1
-- 2 0 1 1
-- 3 1 0 1
-- 4 0 0 1
-- 5 1 1 0
-- 6 0 1 0
-- 7 1 0 0
-- 8 0 0 0
--
-- Values of j higher than the number of active subtables are set
-- to the string "all".
--
-- A key for cfg.protectionCategories is constructed for each value of i.
-- The position of the value in the key is determined by the keypos field in
-- each subtable.
--]]
local cats = cfg.protectionCategories
for i = 1, 2^noActive do
local key = {}
for j, t in ipairs(attemptOrder) do
if j > noActive then
key[t.keypos] = 'all'
else
local quotient = i / 2 ^ (j - 1)
quotient = math.ceil(quotient)
if quotient % 2 == 1 then
key[t.keypos] = t.val
else
key[t.keypos] = 'all'
end
end
end
key = table.concat(key, '|')
local attempt = cats[key]
if attempt then
return makeCategoryLink(attempt, title.text)
end
end
return ''
end
function Protection:isIncorrect()
local expiry = self.expiry
return not self:shouldHaveProtectionCategory()
or type(expiry) == 'number' and expiry < os.time()
end
function Protection:isTemplateProtectedNonTemplate()
local action, namespace = self.action, self.title.namespace
return self.level == 'templateeditor'
and (
(action ~= 'edit' and action ~= 'move')
or (namespace ~= 10 and namespace ~= 828)
)
end
function Protection:makeCategoryLinks()
local msg = self._cfg.msg
local ret = {self:makeProtectionCategory()}
if self:isIncorrect() then
ret[#ret + 1] = makeCategoryLink(
msg['tracking-category-incorrect'],
self.title.text
)
end
if self:isTemplateProtectedNonTemplate() then
ret[#ret + 1] = makeCategoryLink(
msg['tracking-category-template'],
self.title.text
)
end
return table.concat(ret)
end
--------------------------------------------------------------------------------
-- Blurb class
--------------------------------------------------------------------------------
local Blurb = {}
Blurb.__index = Blurb
Blurb.bannerTextFields = {
text = true,
explanation = true,
tooltip = true,
alt = true,
link = true
}
function Blurb.new(protectionObj, args, cfg)
return setmetatable({
_cfg = cfg,
_protectionObj = protectionObj,
_args = args
}, Blurb)
end
-- Private methods --
function Blurb:_formatDate(num)
-- Formats a Unix timestamp into dd Month, YYYY format.
lang = lang or mw.language.getContentLanguage()
local success, date = pcall(
lang.formatDate,
lang,
self._cfg.msg['expiry-date-format'] or 'j F Y',
'@' .. tostring(num)
)
if success then
return date
end
end
function Blurb:_getExpandedMessage(msgKey)
return self:_substituteParameters(self._cfg.msg[msgKey])
end
function Blurb:_substituteParameters(msg)
if not self._params then
local parameterFuncs = {}
parameterFuncs.CURRENTVERSION = self._makeCurrentVersionParameter
parameterFuncs.EDITREQUEST = self._makeEditRequestParameter
parameterFuncs.EXPIRY = self._makeExpiryParameter
parameterFuncs.EXPLANATIONBLURB = self._makeExplanationBlurbParameter
parameterFuncs.IMAGELINK = self._makeImageLinkParameter
parameterFuncs.INTROBLURB = self._makeIntroBlurbParameter
parameterFuncs.INTROFRAGMENT = self._makeIntroFragmentParameter
parameterFuncs.PAGETYPE = self._makePagetypeParameter
parameterFuncs.PROTECTIONBLURB = self._makeProtectionBlurbParameter
parameterFuncs.PROTECTIONDATE = self._makeProtectionDateParameter
parameterFuncs.PROTECTIONLEVEL = self._makeProtectionLevelParameter
parameterFuncs.PROTECTIONLOG = self._makeProtectionLogParameter
parameterFuncs.TALKPAGE = self._makeTalkPageParameter
parameterFuncs.TOOLTIPBLURB = self._makeTooltipBlurbParameter
parameterFuncs.TOOLTIPFRAGMENT = self._makeTooltipFragmentParameter
parameterFuncs.VANDAL = self._makeVandalTemplateParameter
self._params = setmetatable({}, {
__index = function (t, k)
local param
if parameterFuncs[k] then
param = parameterFuncs[k](self)
end
param = param or ''
t[k] = param
return param
end
})
end
msg = msg:gsub('${(%u+)}', self._params)
return msg
end
function Blurb:_makeCurrentVersionParameter()
-- A link to the page history or the move log, depending on the kind of
-- protection.
local pagename = self._protectionObj.title.prefixedText
if self._protectionObj.action == 'move' then
-- We need the move log link.
return makeFullUrl(
'Special:Log',
{type = 'move', page = pagename},
self:_getExpandedMessage('current-version-move-display')
)
else
-- We need the history link.
return makeFullUrl(
pagename,
{action = 'history'},
self:_getExpandedMessage('current-version-edit-display')
)
end
end
function Blurb:_makeEditRequestParameter()
local mEditRequest = require('Module:Submit an edit request')
local action = self._protectionObj.action
local level = self._protectionObj.level
-- Get the edit request type.
local requestType
if action == 'edit' then
if level == 'autoconfirmed' then
requestType = 'semi'
elseif level == 'extendedconfirmed' then
requestType = 'extended'
elseif level == 'templateeditor' then
requestType = 'template'
end
end
requestType = requestType or 'full'
-- Get the display value.
local display = self:_getExpandedMessage('edit-request-display')
return mEditRequest._link{type = requestType, display = display}
end
function Blurb:_makeExpiryParameter()
local expiry = self._protectionObj.expiry
if type(expiry) == 'number' then
return self:_formatDate(expiry)
else
return expiry
end
end
function Blurb:_makeExplanationBlurbParameter()
-- Cover special cases first.
if self._protectionObj.title.namespace == 8 then
-- MediaWiki namespace
return self:_getExpandedMessage('explanation-blurb-nounprotect')
end
-- Get explanation blurb table keys
local action = self._protectionObj.action
local level = self._protectionObj.level
local talkKey = self._protectionObj.title.isTalkPage and 'talk' or 'subject'
-- Find the message in the explanation blurb table and substitute any
-- parameters.
local explanations = self._cfg.explanationBlurbs
local msg
if explanations[action][level] and explanations[action][level][talkKey] then
msg = explanations[action][level][talkKey]
elseif explanations[action][level] and explanations[action][level].default then
msg = explanations[action][level].default
elseif explanations[action].default and explanations[action].default[talkKey] then
msg = explanations[action].default[talkKey]
elseif explanations[action].default and explanations[action].default.default then
msg = explanations[action].default.default
else
error(string.format(
'could not find explanation blurb for action "%s", level "%s" and talk key "%s"',
action,
level,
talkKey
), 8)
end
return self:_substituteParameters(msg)
end
function Blurb:_makeImageLinkParameter()
local imageLinks = self._cfg.imageLinks
local action = self._protectionObj.action
local level = self._protectionObj.level
local msg
if imageLinks[action][level] then
msg = imageLinks[action][level]
elseif imageLinks[action].default then
msg = imageLinks[action].default
else
msg = imageLinks.edit.default
end
return self:_substituteParameters(msg)
end
function Blurb:_makeIntroBlurbParameter()
if self._protectionObj:isTemporary() then
return self:_getExpandedMessage('intro-blurb-expiry')
else
return self:_getExpandedMessage('intro-blurb-noexpiry')
end
end
function Blurb:_makeIntroFragmentParameter()
if self._protectionObj:isTemporary() then
return self:_getExpandedMessage('intro-fragment-expiry')
else
return self:_getExpandedMessage('intro-fragment-noexpiry')
end
end
function Blurb:_makePagetypeParameter()
local pagetypes = self._cfg.pagetypes
return pagetypes[self._protectionObj.title.namespace]
or pagetypes.default
or error('no default pagetype defined', 8)
end
function Blurb:_makeProtectionBlurbParameter()
local protectionBlurbs = self._cfg.protectionBlurbs
local action = self._protectionObj.action
local level = self._protectionObj.level
local msg
if protectionBlurbs[action][level] then
msg = protectionBlurbs[action][level]
elseif protectionBlurbs[action].default then
msg = protectionBlurbs[action].default
elseif protectionBlurbs.edit.default then
msg = protectionBlurbs.edit.default
else
error('no protection blurb defined for protectionBlurbs.edit.default', 8)
end
return self:_substituteParameters(msg)
end
function Blurb:_makeProtectionDateParameter()
local protectionDate = self._protectionObj.protectionDate
if type(protectionDate) == 'number' then
return self:_formatDate(protectionDate)
else
return protectionDate
end
end
function Blurb:_makeProtectionLevelParameter()
local protectionLevels = self._cfg.protectionLevels
local action = self._protectionObj.action
local level = self._protectionObj.level
local msg
if protectionLevels[action][level] then
msg = protectionLevels[action][level]
elseif protectionLevels[action].default then
msg = protectionLevels[action].default
elseif protectionLevels.edit.default then
msg = protectionLevels.edit.default
else
error('no protection level defined for protectionLevels.edit.default', 8)
end
return self:_substituteParameters(msg)
end
function Blurb:_makeProtectionLogParameter()
local pagename = self._protectionObj.title.prefixedText
if self._protectionObj.action == 'autoreview' then
-- We need the pending changes log.
return makeFullUrl(
'Special:Log',
{type = 'stable', page = pagename},
self:_getExpandedMessage('pc-log-display')
)
else
-- We need the protection log.
return makeFullUrl(
'Special:Log',
{type = 'protect', page = pagename},
self:_getExpandedMessage('protection-log-display')
)
end
end
function Blurb:_makeTalkPageParameter()
return string.format(
'[[%s:%s#%s|%s]]',
mw.site.namespaces[self._protectionObj.title.namespace].talk.name,
self._protectionObj.title.text,
self._args.section or 'top',
self:_getExpandedMessage('talk-page-link-display')
)
end
function Blurb:_makeTooltipBlurbParameter()
if self._protectionObj:isTemporary() then
return self:_getExpandedMessage('tooltip-blurb-expiry')
else
return self:_getExpandedMessage('tooltip-blurb-noexpiry')
end
end
function Blurb:_makeTooltipFragmentParameter()
if self._protectionObj:isTemporary() then
return self:_getExpandedMessage('tooltip-fragment-expiry')
else
return self:_getExpandedMessage('tooltip-fragment-noexpiry')
end
end
function Blurb:_makeVandalTemplateParameter()
return mw.getCurrentFrame():expandTemplate{
title="vandal-m",
args={self._args.user or self._protectionObj.title.baseText}
}
end
-- Public methods --
function Blurb:makeBannerText(key)
-- Validate input.
if not key or not Blurb.bannerTextFields[key] then
error(string.format(
'"%s" is not a valid banner config field',
tostring(key)
), 2)
end
-- Generate the text.
local msg = self._protectionObj.bannerConfig[key]
if type(msg) == 'string' then
return self:_substituteParameters(msg)
elseif type(msg) == 'function' then
msg = msg(self._protectionObj, self._args)
if type(msg) ~= 'string' then
error(string.format(
'bad output from banner config function with key "%s"'
.. ' (expected string, got %s)',
tostring(key),
type(msg)
), 4)
end
return self:_substituteParameters(msg)
end
end
--------------------------------------------------------------------------------
-- BannerTemplate class
--------------------------------------------------------------------------------
local BannerTemplate = {}
BannerTemplate.__index = BannerTemplate
function BannerTemplate.new(protectionObj, cfg)
local obj = {}
obj._cfg = cfg
-- Set the image filename.
local imageFilename = protectionObj.bannerConfig.image
if imageFilename then
obj._imageFilename = imageFilename
else
-- If an image filename isn't specified explicitly in the banner config,
-- generate it from the protection status and the namespace.
local action = protectionObj.action
local level = protectionObj.level
local namespace = protectionObj.title.namespace
local reason = protectionObj.reason
-- Deal with special cases first.
if (
namespace == 10
or namespace == 828
or reason and obj._cfg.indefImageReasons[reason]
)
and action == 'edit'
and level == 'sysop'
and not protectionObj:isTemporary()
then
-- Fully protected modules and templates get the special red "indef"
-- padlock.
obj._imageFilename = obj._cfg.msg['image-filename-indef']
else
-- Deal with regular protection types.
local images = obj._cfg.images
if images[action] then
if images[action][level] then
obj._imageFilename = images[action][level]
elseif images[action].default then
obj._imageFilename = images[action].default
end
end
end
end
return setmetatable(obj, BannerTemplate)
end
function BannerTemplate:renderImage()
local filename = self._imageFilename
or self._cfg.msg['image-filename-default']
or 'Transparent.gif'
return makeFileLink{
file = filename,
size = (self.imageWidth or 20) .. 'px',
alt = self._imageAlt,
link = self._imageLink,
caption = self.imageCaption
}
end
--------------------------------------------------------------------------------
-- Banner class
--------------------------------------------------------------------------------
local Banner = setmetatable({}, BannerTemplate)
Banner.__index = Banner
function Banner.new(protectionObj, blurbObj, cfg)
local obj = BannerTemplate.new(protectionObj, cfg) -- This doesn't need the blurb.
obj.imageWidth = 40
obj.imageCaption = blurbObj:makeBannerText('alt') -- Large banners use the alt text for the tooltip.
obj._reasonText = blurbObj:makeBannerText('text')
obj._explanationText = blurbObj:makeBannerText('explanation')
obj._page = protectionObj.title.prefixedText -- Only makes a difference in testing.
return setmetatable(obj, Banner)
end
function Banner:__tostring()
-- Renders the banner.
makeMessageBox = makeMessageBox or require('Module:Message box').main
local reasonText = self._reasonText or error('no reason text set', 2)
local explanationText = self._explanationText
local mbargs = {
page = self._page,
type = 'protection',
image = self:renderImage(),
text = string.format(
"'''%s'''%s",
reasonText,
explanationText and '<br />' .. explanationText or ''
)
}
return makeMessageBox('mbox', mbargs)
end
--------------------------------------------------------------------------------
-- Padlock class
--------------------------------------------------------------------------------
local Padlock = setmetatable({}, BannerTemplate)
Padlock.__index = Padlock
function Padlock.new(protectionObj, blurbObj, cfg)
local obj = BannerTemplate.new(protectionObj, cfg) -- This doesn't need the blurb.
obj.imageWidth = 20
obj.imageCaption = blurbObj:makeBannerText('tooltip')
obj._imageAlt = blurbObj:makeBannerText('alt')
obj._imageLink = blurbObj:makeBannerText('link')
obj._indicatorName = cfg.padlockIndicatorNames[protectionObj.action]
or cfg.padlockIndicatorNames.default
or 'pp-default'
return setmetatable(obj, Padlock)
end
function Padlock:__tostring()
local frame = mw.getCurrentFrame()
-- The nowiki tag helps prevent whitespace at the top of articles.
return frame:extensionTag{name = 'nowiki'} .. frame:extensionTag{
name = 'indicator',
args = {name = self._indicatorName},
content = self:renderImage()
}
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p = {}
function p._exportClasses()
-- This is used for testing purposes.
return {
Protection = Protection,
Blurb = Blurb,
BannerTemplate = BannerTemplate,
Banner = Banner,
Padlock = Padlock,
}
end
function p._main(args, cfg, title)
args = args or {}
cfg = cfg or require(CONFIG_MODULE)
local protectionObj = Protection.new(args, cfg, title)
local ret = {}
-- If a page's edit protection is equally or more restrictive than its
-- protection from some other action, then don't bother displaying anything
-- for the other action (except categories).
if not yesno(args.catonly) and (protectionObj.action == 'edit' or
args.demolevel or
not getReachableNodes(
cfg.hierarchy,
protectionObj.level
)[effectiveProtectionLevel('edit', protectionObj.title)])
then
-- Initialise the blurb object
local blurbObj = Blurb.new(protectionObj, args, cfg)
-- Render the banner
if protectionObj:shouldShowLock() then
ret[#ret + 1] = tostring(
(yesno(args.small) and Padlock or Banner)
.new(protectionObj, blurbObj, cfg)
)
end
end
-- Render the categories
if yesno(args.category) ~= false then
ret[#ret + 1] = protectionObj:makeCategoryLinks()
end
return table.concat(ret)
end
function p.main(frame, cfg)
cfg = cfg or require(CONFIG_MODULE)
-- Find default args, if any.
local parent = frame.getParent and frame:getParent()
local defaultArgs = parent and cfg.wrappers[parent:getTitle():gsub('/sandbox$', '')]
-- Find user args, and use the parent frame if we are being called from a
-- wrapper template.
getArgs = getArgs or require('Module:Arguments').getArgs
local userArgs = getArgs(frame, {
parentOnly = defaultArgs,
frameOnly = not defaultArgs
})
-- Build the args table. User-specified args overwrite default args.
local args = {}
for k, v in pairs(defaultArgs or {}) do
args[k] = v
end
for k, v in pairs(userArgs) do
args[k] = v
end
return p._main(args, cfg)
end
return p
894f0884d4c2da1ce19d385b96f59af654b0946a
Template:Plainlist/styles.css
10
96
151
2022-12-11T06:59:53Z
wikipedia>Izno
0
add this reset from mobile.css
sanitized-css
text/css
/* {{pp-template|small=yes}} */
.plainlist ol,
.plainlist ul {
line-height: inherit;
list-style: none;
margin: 0;
padding: 0; /* Reset Minerva default */
}
.plainlist ol li,
.plainlist ul li {
margin-bottom: 0;
}
51706efa229ff8794c0d94f260a208e7c5e6ec30
Template:Hlist/styles.css
10
97
153
2022-12-26T18:00:17Z
wikipedia>Izno
0
actually remove that block, someone can dig for authorship
sanitized-css
text/css
/* {{pp-protected|reason=match parent|small=yes}} */
/*
* hlist styles are defined in core and Minerva and differ in Minerva. The
* current definitions here (2023-01-01) are sufficient to override Minerva
* without use of the hlist-separated class. The most problematic styles were
* related to margin, padding, and the bullet. Check files listed at
* [[MediaWiki talk:Common.css/to do#hlist-separated]]
*/
/*
* TODO: When the majority of readership supports it (or some beautiful world
* in which grade C support is above the minimum threshold), use :is()
*/
.hlist dl,
.hlist ol,
.hlist ul {
margin: 0;
padding: 0;
}
/* Display list items inline */
.hlist dd,
.hlist dt,
.hlist li {
/*
* don't trust the note that says margin doesn't work with inline
* removing margin: 0 makes dds have margins again
* We also want to reset margin-right in Minerva
*/
margin: 0;
display: inline;
}
/* Display requested top-level lists inline */
.hlist.inline,
.hlist.inline dl,
.hlist.inline ol,
.hlist.inline ul,
/* Display nested lists inline */
.hlist dl dl,
.hlist dl ol,
.hlist dl ul,
.hlist ol dl,
.hlist ol ol,
.hlist ol ul,
.hlist ul dl,
.hlist ul ol,
.hlist ul ul {
display: inline;
}
/* Hide empty list items */
.hlist .mw-empty-li {
display: none;
}
/* TODO: :not() can maybe be used here to remove the later rule. naive test
* seems to work. more testing needed. like so:
*.hlist dt:not(:last-child)::after {
* content: ": ";
*}
*.hlist dd:not(:last-child)::after,
*.hlist li:not(:last-child)::after {
* content: " · ";
* font-weight: bold;
*}
*/
/* Generate interpuncts */
.hlist dt::after {
content: ": ";
}
.hlist dd::after,
.hlist li::after {
content: " · ";
font-weight: bold;
}
.hlist dd:last-child::after,
.hlist dt:last-child::after,
.hlist li:last-child::after {
content: none;
}
/* Add parentheses around nested lists */
.hlist dd dd:first-child::before,
.hlist dd dt:first-child::before,
.hlist dd li:first-child::before,
.hlist dt dd:first-child::before,
.hlist dt dt:first-child::before,
.hlist dt li:first-child::before,
.hlist li dd:first-child::before,
.hlist li dt:first-child::before,
.hlist li li:first-child::before {
content: " (";
font-weight: normal;
}
.hlist dd dd:last-child::after,
.hlist dd dt:last-child::after,
.hlist dd li:last-child::after,
.hlist dt dd:last-child::after,
.hlist dt dt:last-child::after,
.hlist dt li:last-child::after,
.hlist li dd:last-child::after,
.hlist li dt:last-child::after,
.hlist li li:last-child::after {
content: ")";
font-weight: normal;
}
/* Put ordinals in front of ordered list items */
.hlist ol {
counter-reset: listitem;
}
.hlist ol > li {
counter-increment: listitem;
}
.hlist ol > li::before {
content: " " counter(listitem) "\a0";
}
.hlist dd ol > li:first-child::before,
.hlist dt ol > li:first-child::before,
.hlist li ol > li:first-child::before {
content: " (" counter(listitem) "\a0";
}
8c9dd9c9c00f30eead17fe10f51d183333e81f33
Module:Navbox/configuration
828
64
87
2022-12-29T18:14:27Z
wikipedia>Izno
0
get these in
Scribunto
text/plain
return {
aria_label = 'Navbox',
nowrap_item = '%s<span class="nowrap">%s</span>',
templatestyles = mw.getCurrentFrame():extensionTag{
name = 'templatestyles', args = { src = 'Module:Navbox/styles.css' }
},
hlist_templatestyles = 'Hlist/styles.css',
plainlist_templatestyles = 'Plainlist/styles.css',
-- do not localize marker table
marker = {
oddeven = '\127_ODDEVEN_\127',
restart = '\127_ODDEVEN0_\127',
regex = '\127_ODDEVEN(%d?)_\127'
},
category = {
orphan = '[[Category:Navbox orphans]]',
horizontal_lists = 'Navigational boxes without horizontal lists',
background_colors = 'Navboxes using background colours',
illegible = 'Potentially illegible navboxes',
borders = 'Navboxes using borders',
},
keyword = {
border_subgroup = 'subgroup',
border_child = 'child',
border_none = 'none',
evenodd_swap = 'swap',
navbar_off = 'off',
navbar_plain = 'plain',
nocat_false = 'false',
nowrapitems_yes = 'yes',
orphan_yes = 'yes',
state_collapsed = 'collapsed',
state_off = 'off',
state_plain = 'plain',
subpage_doc = 'doc',
subpage_sandbox = 'sandbox',
subpage_testcases = 'testcases',
tracking_no = 'no'
},
class = {
autocollapse = 'autocollapse',
collapsible = 'mw-collapsible',
collapsed = 'mw-collapsed',
-- Warning
navbox = 'navbox', -- WMF currently hides 'navbox' from mobile,
-- so you probably shouldn't change the navbox class.
navbox_abovebelow = 'navbox-abovebelow',
navbox_group = 'navbox-group',
navbox_image = 'navbox-image',
navbox_inner = 'navbox-inner',
navbox_list = 'navbox-list',
navbox_list_with_group = 'navbox-list-with-group',
navbox_part = 'navbox-', -- do not l10n
navbox_styles = 'navbox-styles',
navbox_subgroup = 'navbox-subgroup',
navbox_title = 'navbox-title', -- l10n only if you change pattern.navbox_title below
navbox_odd_part = 'odd', -- do not l10n
navbox_even_part = 'even', -- do not l10n
nomobile = 'nomobile',
nowraplinks = 'nowraplinks',
noviewer = 'noviewer' -- used to remove images from MediaViewer
},
pattern = {
listnum = '^list(%d+)$',
class = 'class',
sandbox = '/sandbox$',
navbox = 'Template:Navbox',
nowrap = '^<span class="nowrap">',
style = 'style$',
navbox_title = '<th[^>]*"navbox%-title"',
hlist = 'hlist',
plainlist = 'plainlist',
},
arg = {
above = 'above',
aboveclass = 'aboveclass',
abovestyle = 'abovestyle',
basestyle = 'basestyle',
bodyclass = 'bodyclass',
bodystyle = 'bodystyle',
border = 'border',
below = 'below',
belowclass = 'belowclass',
belowstyle = 'belowstyle',
evenodd = 'evenodd',
evenstyle = 'evenstyle',
group1 = 'group1',
group2 = 'group2',
group_and_num = 'group%d',
groupstyle_and_num = 'group%dstyle',
groupclass = 'groupclass',
groupstyle = 'groupstyle',
groupwidth = 'groupwidth',
innerstyle = 'innerstyle',
image = 'image',
imageclass = 'imageclass',
imageleft = 'imageleft',
imageleftstyle = 'imageleftstyle',
imagesetyle = 'imagestyle',
list_and_num = 'list%d',
listclass_and_num = 'list%dclass',
liststyle_and_num = 'list%dstyle',
list1padding = 'list1padding',
listclass = 'listclass',
listpadding = 'listpadding',
liststyle = 'liststyle',
name = 'name',
navbar = 'navbar',
navboxclass = 'navboxclass',
nocat = 'nocat',
nowrapitems = 'nowrapitems',
oddstyle = 'oddstyle',
orphan = 'orphan',
state = 'state',
style = 'style',
templatestyles = 'templatestyles',
child_templatestyles = 'child templatestyles',
title = 'title',
titleclass = 'titleclass',
titlestyle = 'titlestyle',
tracking = 'tracking'
},
-- names of navbar arguments
navbar = {
name = 1,
fontstyle = 'fontstyle',
mini = 'mini'
}
}
4148736fd32a93636c0413e73ed38afaef065ec9
Module:Navbar/configuration
828
63
85
2022-12-29T18:18:21Z
wikipedia>Izno
0
add hlist/styles.css
Scribunto
text/plain
return {
['templatestyles'] = 'Module:Navbar/styles.css',
['hlist_templatestyles'] = 'Hlist/styles.css',
['box_text'] = 'This box: ', -- default text box when not plain or mini
['title_namespace'] = 'Template', -- namespace to default to for title
['invalid_title'] = 'Invalid title ',
['classes'] = { -- set a line to nil if you don't want it
['navbar'] = 'navbar',
['plainlinks'] = 'plainlinks', -- plainlinks
['horizontal_list'] = 'hlist', -- horizontal list class
['mini'] = 'navbar-mini', -- class indicating small links in the navbar
['this_box'] = 'navbar-boxtext',
['brackets'] = 'navbar-brackets',
-- 'collapsible' is the key for a class to indicate the navbar is
-- setting up the collapsible element in addition to the normal
-- navbar.
['collapsible'] = 'navbar-collapse',
['collapsible_title_mini'] = 'navbar-ct-mini',
['collapsible_title_full'] = 'navbar-ct-full'
}
}
b007c336b17ec4bcd4d5a9dca9f8cba301662b55
Template:Dated maintenance category (articles)
10
146
251
2023-02-03T03:07:34Z
wikipedia>UtherSRG
0
UtherSRG moved page [[Template:DMCA]] to [[Template:Dated maintenance category (articles)]]: [[Special:Permalink/1137158761|Requested]] by Robertsky at [[WP:RM/TR]]: Per RM discussion. See [[Template_talk:DMCA#Requested_move_26_January_2023]]. Template protected at template editor/admin level
wikitext
text/x-wiki
{{Dated maintenance category
|onlyarticles=yes
|1={{{1|}}}
|2={{{2|}}}
|3={{{3|}}}
|4={{{4|}}}
|5={{{5|}}}
}}<noinclude>
{{documentation|Template:Dated maintenance category/doc}}
</noinclude>
6bbc57c75cc28708a0e71dd658224d5945d80d68
Template:DMCA
10
98
155
2023-02-03T21:12:07Z
wikipedia>Paine Ellsworth
0
add [[WP:RCAT|rcat template]]
wikitext
text/x-wiki
#REDIRECT [[Template:Dated maintenance category (articles)]]
{{Redirect category shell|
{{R from move}}
{{R from modification}}
{{R from template shortcut}}
}}
711d3f1c53fa704297f675a8dcf1a56719c5b654
Module:Lua banner
828
81
121
2023-02-16T14:39:53Z
wikipedia>Uzume
0
[[Module:Citation]] has been blanked since [[Wikipedia:Templates for discussion/Log/2018 May 13#Module:Citation]]; remove special handling
Scribunto
text/plain
-- This module implements the {{lua}} template.
local yesno = require('Module:Yesno')
local mList = require('Module:List')
local mTableTools = require('Module:TableTools')
local mMessageBox = require('Module:Message box')
local p = {}
function p.main(frame)
local origArgs = frame:getParent().args
local args = {}
for k, v in pairs(origArgs) do
v = v:match('^%s*(.-)%s*$')
if v ~= '' then
args[k] = v
end
end
return p._main(args)
end
function p._main(args)
local modules = mTableTools.compressSparseArray(args)
local box = p.renderBox(modules)
local trackingCategories = p.renderTrackingCategories(args, modules)
return box .. trackingCategories
end
function p.renderBox(modules)
local boxArgs = {}
if #modules < 1 then
boxArgs.text = '<strong class="error">Error: no modules specified</strong>'
else
local moduleLinks = {}
for i, module in ipairs(modules) do
moduleLinks[i] = string.format('[[:%s]]', module)
local maybeSandbox = mw.title.new(module .. '/sandbox')
if maybeSandbox.exists then
moduleLinks[i] = moduleLinks[i] .. string.format(' ([[:%s|sandbox]])', maybeSandbox.fullText)
end
end
local moduleList = mList.makeList('bulleted', moduleLinks)
local title = mw.title.getCurrentTitle()
if title.subpageText == "doc" then
title = title.basePageTitle
end
if title.contentModel == "Scribunto" then
boxArgs.text = 'This module depends on the following other modules:' .. moduleList
else
boxArgs.text = 'This template uses [[Wikipedia:Lua|Lua]]:\n' .. moduleList
end
end
boxArgs.type = 'notice'
boxArgs.small = true
boxArgs.image = '[[File:Lua-Logo.svg|30px|alt=|link=]]'
return mMessageBox.main('mbox', boxArgs)
end
function p.renderTrackingCategories(args, modules, titleObj)
if yesno(args.nocat) then
return ''
end
local cats = {}
-- Error category
if #modules < 1 then
cats[#cats + 1] = 'Lua templates with errors'
end
-- Lua templates category
titleObj = titleObj or mw.title.getCurrentTitle()
local subpageBlacklist = {
doc = true,
sandbox = true,
sandbox2 = true,
testcases = true
}
if not subpageBlacklist[titleObj.subpageText] then
local protCatName
if titleObj.namespace == 10 then
local category = args.category
if not category then
local categories = {
['Module:String'] = 'Templates based on the String Lua module',
['Module:Math'] = 'Templates based on the Math Lua module',
['Module:BaseConvert'] = 'Templates based on the BaseConvert Lua module',
['Module:Citation/CS1'] = 'Templates based on the Citation/CS1 Lua module'
}
category = modules[1] and categories[modules[1]]
category = category or 'Lua-based templates'
end
cats[#cats + 1] = category
protCatName = "Templates using under-protected Lua modules"
elseif titleObj.namespace == 828 then
protCatName = "Modules depending on under-protected modules"
end
if not args.noprotcat and protCatName then
local protLevels = {
autoconfirmed = 1,
extendedconfirmed = 2,
templateeditor = 3,
sysop = 4
}
local currentProt
if titleObj.id ~= 0 then
-- id is 0 (page does not exist) if am previewing before creating a template.
currentProt = titleObj.protectionLevels["edit"][1]
end
if currentProt == nil then currentProt = 0 else currentProt = protLevels[currentProt] end
for i, module in ipairs(modules) do
if module ~= "WP:libraryUtil" then
local moduleProt = mw.title.new(module).protectionLevels["edit"][1]
if moduleProt == nil then moduleProt = 0 else moduleProt = protLevels[moduleProt] end
if moduleProt < currentProt then
cats[#cats + 1] = protCatName
break
end
end
end
end
end
for i, cat in ipairs(cats) do
cats[i] = string.format('[[Category:%s]]', cat)
end
return table.concat(cats)
end
return p
03ec1b34a40121efc562c0c64a67ebbf57d56dff
Module:Sidebar/configuration
828
69
97
2023-03-14T22:32:24Z
wikipedia>Izno
0
add hlist and plainlist_templatestyles keys
Scribunto
text/plain
return {
i18n = {
child_yes = 'yes',
float_none = 'none',
float_left = 'left',
wrap_true = 'true',
navbar_none = 'none',
navbar_off = 'off',
default_list_title = 'List',
title_not_to_add_navbar = 'Template:Sidebar',
collapse_title_not_to_add_navbar = 'Template:Sidebar with collapsible lists',
templatestyles = 'Module:Sidebar/styles.css',
hlist_templatestyles = 'Hlist/styles.css',
plainlist_templatestyles = 'Plainlist/styles.css',
category = {
child = '[[Category:Pages using sidebar with the child parameter]]',
conversion = '[[Category:Sidebars with styles needing conversion]]'
},
pattern = {
collapse_sandbox = '/sandbox$',
sandbox = '/sandbox$',
subgroup = 'sidebar%-subgroup',
style_conversion = 'style$',
uncategorized_conversion_titles = {
'/[Ss]andbox',
'/[Tt]estcases',
'/[Dd]oc$'
}
},
class = {
sidebar = 'sidebar',
subgroup = 'sidebar-subgroup',
collapse = 'sidebar-collapse',
float_none = 'sidebar-none',
float_left = 'sidebar-left',
wraplinks = 'nowraplinks',
outer_title = 'sidebar-outer-title',
top_image = 'sidebar-top-image',
top_caption = 'sidebar-top-caption',
pretitle = 'sidebar-pretitle',
pretitle_with_top_image = 'sidebar-pretitle-with-top-image',
title = 'sidebar-title',
title_with_pretitle = 'sidebar-title-with-pretitle',
image = 'sidebar-image',
caption = 'sidebar-caption',
above = 'sidebar-above',
heading = 'sidebar-heading',
content = 'sidebar-content',
content_with_subgroup = 'sidebar-content-with-subgroup',
below = 'sidebar-below',
navbar = 'sidebar-navbar',
list = 'sidebar-list',
list_title = 'sidebar-list-title',
list_title_centered = 'sidebar-list-title-c',
list_content = 'sidebar-list-content'
}
}
}
dc2a980ac2162a898f7c21e6d6ba7e994dfeb315
Module:Sidebar
828
68
95
2023-03-14T22:35:53Z
wikipedia>Izno
0
move these items to config, discovered during work at meta
Scribunto
text/plain
require('strict')
local cfg = mw.loadData('Module:Sidebar/configuration')
local p = {}
local getArgs = require('Module:Arguments').getArgs
--[[
Categorizes calling templates and modules with a 'style' parameter of any sort
for tracking to convert to TemplateStyles.
TODO after a long cleanup: Catch sidebars in other namespaces than Template and Module.
TODO would probably want to remove /log and /archive as CS1 does
]]
local function categorizeTemplatesWithInlineStyles(args)
local title = mw.title.getCurrentTitle()
if title.namespace ~= 10 and title.namespace ~= 828 then return '' end
for _, pattern in ipairs (cfg.i18n.pattern.uncategorized_conversion_titles) do
if title.text:match(pattern) then return '' end
end
for key, _ in pairs(args) do
if mw.ustring.find(key, cfg.i18n.pattern.style_conversion) or key == 'width' then
return cfg.i18n.category.conversion
end
end
end
--[[
For compatibility with the original {{sidebar with collapsible lists}}
implementation, which passed some parameters through {{#if}} to trim their
whitespace. This also triggered the automatic newline behavior.
]]
-- See ([[meta:Help:Newlines and spaces#Automatic newline]])
local function trimAndAddAutomaticNewline(s)
s = mw.ustring.gsub(s, "^%s*(.-)%s*$", "%1")
if mw.ustring.find(s, '^[#*:;]') or mw.ustring.find(s, '^{|') then
return '\n' .. s
else
return s
end
end
--[[
Finds whether a sidebar has a subgroup sidebar.
]]
local function hasSubgroup(s)
if mw.ustring.find(s, cfg.i18n.pattern.subgroup) then
return true
else
return false
end
end
local function has_navbar(navbar_mode, sidebar_name)
return navbar_mode ~= cfg.i18n.navbar_none and
navbar_mode ~= cfg.i18n.navbar_off and
(
sidebar_name or
mw.getCurrentFrame():getParent():getTitle():gsub(cfg.i18n.pattern.sandbox, '') ~=
cfg.i18n.title_not_to_add_navbar
)
end
local function has_list_class(args, htmlclass)
local patterns = {
'^' .. htmlclass .. '$',
'%s' .. htmlclass .. '$',
'^' .. htmlclass .. '%s',
'%s' .. htmlclass .. '%s'
}
for arg, value in pairs(args) do
if type(arg) == 'string' and mw.ustring.find(arg, 'class') then
for _, pattern in ipairs(patterns) do
if mw.ustring.find(args[arg] or '', pattern) then
return true
end
end
end
end
return false
end
-- there are a lot of list classes in the wild, so we add their TemplateStyles
local function add_list_styles(args)
local frame = mw.getCurrentFrame()
local function add_list_templatestyles(htmlclass, templatestyles)
if has_list_class(args, htmlclass) then
return frame:extensionTag{
name = 'templatestyles', args = { src = templatestyles }
}
else
return ''
end
end
local plainlist_styles = add_list_templatestyles('plainlist', cfg.i18n.plainlist_templatestyles)
local hlist_styles = add_list_templatestyles('hlist', cfg.i18n.hlist_templatestyles)
-- a second workaround for [[phab:T303378]]
-- when that issue is fixed, we can actually use has_navbar not to emit the
-- tag here if we want
if has_navbar(args.navbar, args.name) and hlist_styles == '' then
hlist_styles = frame:extensionTag{
name = 'templatestyles', args = { src = cfg.i18n.hlist_templatestyles}
}
end
-- hlist -> plainlist is best-effort to preserve old Common.css ordering. [hlist_note]
return hlist_styles .. plainlist_styles
end
-- work around [[phab:T303378]]
-- for each arg: find all the templatestyles strip markers, insert them into a
-- table. then remove all templatestyles markers from the arg
local function move_hiding_templatestyles(args)
local gfind = string.gfind
local gsub = string.gsub
local templatestyles_markers = {}
local strip_marker_pattern = '(\127[^\127]*UNIQ%-%-templatestyles%-%x+%-QINU[^\127]*\127)'
for k, arg in pairs(args) do
for marker in gfind(arg, strip_marker_pattern) do
table.insert(templatestyles_markers, marker)
end
args[k] = gsub(arg, strip_marker_pattern, '')
end
return templatestyles_markers
end
--[[
Main sidebar function. Takes the frame, args, and an optional collapsibleClass.
The collapsibleClass is and should be used only for sidebars with collapsible
lists, as in p.collapsible.
]]
function p.sidebar(frame, args, collapsibleClass)
if not args then
args = getArgs(frame)
end
local hiding_templatestyles = table.concat(move_hiding_templatestyles(args))
local root = mw.html.create()
local child = args.child and mw.text.trim(args.child) == cfg.i18n.child_yes
root = root:tag('table')
if not child then
root
:addClass(cfg.i18n.class.sidebar)
-- force collapsibleclass to be sidebar-collapse otherwise output nothing
:addClass(collapsibleClass == cfg.i18n.class.collapse and cfg.i18n.class.collapse or nil)
:addClass('nomobile')
:addClass(args.float == cfg.i18n.float_none and cfg.i18n.class.float_none or nil)
:addClass(args.float == cfg.i18n.float_left and cfg.i18n.class.float_left or nil)
:addClass(args.wraplinks ~= cfg.i18n.wrap_true and cfg.i18n.class.wraplinks or nil)
:addClass(args.bodyclass or args.class)
:css('width', args.width or nil)
:cssText(args.bodystyle or args.style)
if args.outertitle then
root
:tag('caption')
:addClass(cfg.i18n.class.outer_title)
:addClass(args.outertitleclass)
:cssText(args.outertitlestyle)
:wikitext(args.outertitle)
end
if args.topimage then
local imageCell = root:tag('tr'):tag('td')
imageCell
:addClass(cfg.i18n.class.top_image)
:addClass(args.topimageclass)
:cssText(args.topimagestyle)
:wikitext(args.topimage)
if args.topcaption then
imageCell
:tag('div')
:addClass(cfg.i18n.class.top_caption)
:cssText(args.topcaptionstyle)
:wikitext(args.topcaption)
end
end
if args.pretitle then
root
:tag('tr')
:tag('td')
:addClass(args.topimage and cfg.i18n.class.pretitle_with_top_image
or cfg.i18n.class.pretitle)
:addClass(args.pretitleclass)
:cssText(args.basestyle)
:cssText(args.pretitlestyle)
:wikitext(args.pretitle)
end
else
root
:addClass(cfg.i18n.class.subgroup)
:addClass(args.bodyclass or args.class)
:cssText(args.bodystyle or args.style)
end
if args.title then
if child then
root
:wikitext(args.title)
else
root
:tag('tr')
:tag('th')
:addClass(args.pretitle and cfg.i18n.class.title_with_pretitle
or cfg.i18n.class.title)
:addClass(args.titleclass)
:cssText(args.basestyle)
:cssText(args.titlestyle)
:wikitext(args.title)
end
end
if args.image then
local imageCell = root:tag('tr'):tag('td')
imageCell
:addClass(cfg.i18n.class.image)
:addClass(args.imageclass)
:cssText(args.imagestyle)
:wikitext(args.image)
if args.caption then
imageCell
:tag('div')
:addClass(cfg.i18n.class.caption)
:cssText(args.captionstyle)
:wikitext(args.caption)
end
end
if args.above then
root
:tag('tr')
:tag('td')
:addClass(cfg.i18n.class.above)
:addClass(args.aboveclass)
:cssText(args.abovestyle)
:newline() -- newline required for bullet-points to work
:wikitext(args.above)
end
local rowNums = {}
for k, v in pairs(args) do
k = '' .. k
local num = k:match('^heading(%d+)$') or k:match('^content(%d+)$')
if num then table.insert(rowNums, tonumber(num)) end
end
table.sort(rowNums)
-- remove duplicates from the list (e.g. 3 will be duplicated if both heading3
-- and content3 are specified)
for i = #rowNums, 1, -1 do
if rowNums[i] == rowNums[i - 1] then
table.remove(rowNums, i)
end
end
for i, num in ipairs(rowNums) do
local heading = args['heading' .. num]
if heading then
root
:tag('tr')
:tag('th')
:addClass(cfg.i18n.class.heading)
:addClass(args.headingclass)
:addClass(args['heading' .. num .. 'class'])
:cssText(args.basestyle)
:cssText(args.headingstyle)
:cssText(args['heading' .. num .. 'style'])
:newline()
:wikitext(heading)
end
local content = args['content' .. num]
if content then
root
:tag('tr')
:tag('td')
:addClass(hasSubgroup(content) and cfg.i18n.class.content_with_subgroup
or cfg.i18n.class.content)
:addClass(args.contentclass)
:addClass(args['content' .. num .. 'class'])
:cssText(args.contentstyle)
:cssText(args['content' .. num .. 'style'])
:newline()
:wikitext(content)
:done()
-- Without a linebreak after the </td>, a nested list like
-- "* {{hlist| ...}}" doesn't parse correctly.
:newline()
end
end
if args.below then
root
:tag('tr')
:tag('td')
:addClass(cfg.i18n.class.below)
:addClass(args.belowclass)
:cssText(args.belowstyle)
:newline()
:wikitext(args.below)
end
if not child and has_navbar(args.navbar, args.name) then
root
:tag('tr')
:tag('td')
:addClass(cfg.i18n.class.navbar)
:cssText(args.navbarstyle)
:wikitext(require('Module:Navbar')._navbar{
args.name,
mini = 1,
fontstyle = args.navbarfontstyle
})
end
local base_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = cfg.i18n.templatestyles }
}
local templatestyles = ''
if args['templatestyles'] and args['templatestyles'] ~= '' then
templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['templatestyles'] }
}
end
local child_templatestyles = ''
if args['child templatestyles'] and args['child templatestyles'] ~= '' then
child_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['child templatestyles'] }
}
end
local grandchild_templatestyles = ''
if args['grandchild templatestyles'] and args['grandchild templatestyles'] ~= '' then
grandchild_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['grandchild templatestyles'] }
}
end
return table.concat({
add_list_styles(args), -- see [hlist_note] above about ordering
base_templatestyles,
templatestyles,
child_templatestyles,
grandchild_templatestyles,
hiding_templatestyles,
tostring(root),
(child and cfg.i18n.category.child or ''),
categorizeTemplatesWithInlineStyles(args)
})
end
local function list_title(args, is_centered_list_titles, num)
local title_text = trimAndAddAutomaticNewline(args['list' .. num .. 'title']
or cfg.i18n.default_list_title)
local title
if is_centered_list_titles then
-- collapsible can be finicky, so provide some CSS/HTML to support
title = mw.html.create('div')
:addClass(cfg.i18n.class.list_title_centered)
:wikitext(title_text)
else
title = mw.html.create()
:wikitext(title_text)
end
local title_container = mw.html.create('div')
:addClass(cfg.i18n.class.list_title)
-- don't /need/ a listnumtitleclass because you can do
-- .templateclass .listnumclass .sidebar-list-title
:addClass(args.listtitleclass)
:cssText(args.basestyle)
:cssText(args.listtitlestyle)
:cssText(args['list' .. num .. 'titlestyle'])
:node(title)
:done()
return title_container
end
--[[
Main entry point for sidebar with collapsible lists.
Does the work of creating the collapsible lists themselves and including them
into the args.
]]
function p.collapsible(frame)
local args = getArgs(frame)
if not args.name and
frame:getParent():getTitle():gsub(cfg.i18n.pattern.collapse_sandbox, '') ==
cfg.i18n.collapse_title_not_to_add_navbar then
args.navbar = cfg.i18n.navbar_none
end
local contentArgs = {}
local is_centered_list_titles = false
if args['centered list titles'] and args['centered list titles'] ~= '' then
is_centered_list_titles = true
end
for k, v in pairs(args) do
local num = string.match(k, '^list(%d+)$')
if num then
local expand = args.expanded and
(args.expanded == 'all' or args.expanded == args['list' .. num .. 'name'])
local row = mw.html.create('div')
row
:addClass(cfg.i18n.class.list)
:addClass('mw-collapsible')
:addClass((not expand) and 'mw-collapsed' or nil)
:addClass(args['list' .. num .. 'class'])
:cssText(args.listframestyle)
:cssText(args['list' .. num .. 'framestyle'])
:node(list_title(args, is_centered_list_titles, num))
:tag('div')
:addClass(cfg.i18n.class.list_content)
:addClass('mw-collapsible-content')
-- don't /need/ a listnumstyleclass because you can do
-- .templatename .listnumclass .sidebar-list
:addClass(args.listclass)
:cssText(args.liststyle)
:cssText(args['list' .. num .. 'style'])
:wikitext(trimAndAddAutomaticNewline(args['list' .. num]))
contentArgs['content' .. num] = tostring(row)
end
end
for k, v in pairs(contentArgs) do
args[k] = v
end
return p.sidebar(frame, args, cfg.i18n.class.collapse)
end
return p
71fe765846593e025ca2f94371315e9dbb5bb4d2
Template:Self-reference
10
138
235
2023-03-30T11:42:06Z
wikipedia>Mclay1
0
Mclay1 moved page [[Template:Self reference]] to [[Template:Self-reference]]: grammatically correct hyphen
wikitext
text/x-wiki
{{#switch:{{{2|NONE}}}
|NONE|hatnote|hat={{Hatnote|extraclasses=plainlinks selfreference noprint|1={{{1}}}}}
|inline=<div class="plainlinks selfreference" style="display:inline; font-style: italic;"><!--Same style as class hatnote.-->{{{1}}}</div>
|<!--Matching the empty string here for unprintworthy content is for backwards compatibility with the 2006-2008 version. Do not depend on it!-->=<div style="display:inline;" class="plainlinks selfreference noprint">{{{1}}}</div>
|#default={{error|Second parameter must be <code>hatnote</code>, <code>hat</code>, or <code>inline</code>}}
}}<noinclude>
{{Documentation}}
<!-- PLEASE ADD THIS TEMPLATE'S CATEGORIES THE /doc SUBPAGE, AND INTERWIKIS TO WIKIDATA, THANKS -->
</noinclude>
0c4a08f880070e918c3edcaa50cc493f99841e98
Template:Selfref
10
134
227
2023-03-30T20:46:51Z
wikipedia>Xqbot
0
Bot: Fixing double redirect to [[Template:Self-reference]]
wikitext
text/x-wiki
#REDIRECT [[Template:Self-reference]]
{{Redirect category shell|
{{R from template shortcut}}
{{R from alternative spelling}}
{{R from move}}
}}
030c372ed4f83fa2e03a4c0ccdd4ad3cef8ec9e6
Template:Uses TemplateStyles
10
90
139
2023-04-18T22:22:16Z
wikipedia>Grufo
0
Move the preview inside the documentation
wikitext
text/x-wiki
<includeonly>{{#invoke:Uses TemplateStyles|main}}</includeonly><noinclude>{{documentation}}
<!-- Categories go on the /doc subpage and interwikis go on Wikidata. -->
</noinclude>
60f2fc73c4d69b292455879f9fcb3c68f6c63c2a
Template:Documentation subpage
10
131
221
2023-04-29T17:27:17Z
wikipedia>Paine Ellsworth
0
m
wikitext
text/x-wiki
<includeonly><!--
-->{{#ifeq:{{lc:{{SUBPAGENAME}}}} |{{{override|doc}}}
| <!--(this template has been transcluded on a /doc or /{{{override}}} page)-->
</includeonly><!--
-->{{#ifeq:{{{doc-notice|show}}} |show
| {{Mbox
| type = notice
| style = margin-bottom:1.0em;
| image = [[File:Edit-copy green.svg|40px|alt=|link=]]
| text =
{{strong|This is a [[Wikipedia:Template documentation|documentation]] [[Wikipedia:Subpages|subpage]]}} for {{terminate sentence|{{{1|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}]]}}}}}<br />It may contain usage information, [[Wikipedia:Categorization|categories]] and other content that is not part of the original {{#if:{{{text2|}}} |{{{text2}}} |{{#if:{{{text1|}}} |{{{text1}}} |{{#ifeq:{{SUBJECTSPACE}} |{{ns:User}} |{{lc:{{SUBJECTSPACE}}}} template page |{{#if:{{SUBJECTSPACE}} |{{lc:{{SUBJECTSPACE}}}} page|article}}}}}}}}.
}}
}}<!--
-->{{DEFAULTSORT:{{{defaultsort|{{PAGENAME}}}}}}}<!--
-->{{#if:{{{inhibit|}}} |<!--(don't categorize)-->
| <includeonly><!--
-->{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}
| [[Category:{{#switch:{{SUBJECTSPACE}} |Template=Template |Module=Module |User=User |#default=Wikipedia}} documentation pages]]
| [[Category:Documentation subpages without corresponding pages]]
}}<!--
--></includeonly>
}}<!--
(completing initial #ifeq: at start of template:)
--><includeonly>
| <!--(this template has not been transcluded on a /doc or /{{{override}}} page)-->
}}<!--
--></includeonly><noinclude>{{Documentation}}</noinclude>
41ca90af0945442788a2dbd08c8c54a61a23c057
Module:Navbox
828
47
56
2023-05-28T13:26:56Z
wikipedia>Uzume
0
strict
Scribunto
text/plain
require('strict')
local p = {}
local navbar = require('Module:Navbar')._navbar
local cfg = mw.loadData('Module:Navbox/configuration')
local getArgs -- lazily initialized
local args
local format = string.format
local function striped(wikitext, border)
-- Return wikitext with markers replaced for odd/even striping.
-- Child (subgroup) navboxes are flagged with a category that is removed
-- by parent navboxes. The result is that the category shows all pages
-- where a child navbox is not contained in a parent navbox.
local orphanCat = cfg.category.orphan
if border == cfg.keyword.border_subgroup and args[cfg.arg.orphan] ~= cfg.keyword.orphan_yes then
-- No change; striping occurs in outermost navbox.
return wikitext .. orphanCat
end
local first, second = cfg.class.navbox_odd_part, cfg.class.navbox_even_part
if args[cfg.arg.evenodd] then
if args[cfg.arg.evenodd] == cfg.keyword.evenodd_swap then
first, second = second, first
else
first = args[cfg.arg.evenodd]
second = first
end
end
local changer
if first == second then
changer = first
else
local index = 0
changer = function (code)
if code == '0' then
-- Current occurrence is for a group before a nested table.
-- Set it to first as a valid although pointless class.
-- The next occurrence will be the first row after a title
-- in a subgroup and will also be first.
index = 0
return first
end
index = index + 1
return index % 2 == 1 and first or second
end
end
local regex = orphanCat:gsub('([%[%]])', '%%%1')
return (wikitext:gsub(regex, ''):gsub(cfg.marker.regex, changer)) -- () omits gsub count
end
local function processItem(item, nowrapitems)
if item:sub(1, 2) == '{|' then
-- Applying nowrap to lines in a table does not make sense.
-- Add newlines to compensate for trim of x in |parm=x in a template.
return '\n' .. item ..'\n'
end
if nowrapitems == cfg.keyword.nowrapitems_yes then
local lines = {}
for line in (item .. '\n'):gmatch('([^\n]*)\n') do
local prefix, content = line:match('^([*:;#]+)%s*(.*)')
if prefix and not content:match(cfg.pattern.nowrap) then
line = format(cfg.nowrap_item, prefix, content)
end
table.insert(lines, line)
end
item = table.concat(lines, '\n')
end
if item:match('^[*:;#]') then
return '\n' .. item ..'\n'
end
return item
end
local function has_navbar()
return args[cfg.arg.navbar] ~= cfg.keyword.navbar_off
and args[cfg.arg.navbar] ~= cfg.keyword.navbar_plain
and (
args[cfg.arg.name]
or mw.getCurrentFrame():getParent():getTitle():gsub(cfg.pattern.sandbox, '')
~= cfg.pattern.navbox
)
end
local function renderNavBar(titleCell)
if has_navbar() then
titleCell:wikitext(navbar{
[cfg.navbar.name] = args[cfg.arg.name],
[cfg.navbar.mini] = 1,
[cfg.navbar.fontstyle] = (args[cfg.arg.basestyle] or '') .. ';' ..
(args[cfg.arg.titlestyle] or '') ..
';background:none transparent;border:none;box-shadow:none;padding:0;'
})
end
end
local function renderTitleRow(tbl)
if not args[cfg.arg.title] then return end
local titleRow = tbl:tag('tr')
local titleCell = titleRow:tag('th'):attr('scope', 'col')
local titleColspan = 2
if args[cfg.arg.imageleft] then titleColspan = titleColspan + 1 end
if args[cfg.arg.image] then titleColspan = titleColspan + 1 end
titleCell
:cssText(args[cfg.arg.basestyle])
:cssText(args[cfg.arg.titlestyle])
:addClass(cfg.class.navbox_title)
:attr('colspan', titleColspan)
renderNavBar(titleCell)
titleCell
:tag('div')
-- id for aria-labelledby attribute
:attr('id', mw.uri.anchorEncode(args[cfg.arg.title]))
:addClass(args[cfg.arg.titleclass])
:css('font-size', '114%')
:css('margin', '0 4em')
:wikitext(processItem(args[cfg.arg.title]))
end
local function getAboveBelowColspan()
local ret = 2
if args[cfg.arg.imageleft] then ret = ret + 1 end
if args[cfg.arg.image] then ret = ret + 1 end
return ret
end
local function renderAboveRow(tbl)
if not args[cfg.arg.above] then return end
tbl:tag('tr')
:tag('td')
:addClass(cfg.class.navbox_abovebelow)
:addClass(args[cfg.arg.aboveclass])
:cssText(args[cfg.arg.basestyle])
:cssText(args[cfg.arg.abovestyle])
:attr('colspan', getAboveBelowColspan())
:tag('div')
-- id for aria-labelledby attribute, if no title
:attr('id', (not args[cfg.arg.title]) and mw.uri.anchorEncode(args[cfg.arg.above]) or nil)
:wikitext(processItem(args[cfg.arg.above], args[cfg.arg.nowrapitems]))
end
local function renderBelowRow(tbl)
if not args[cfg.arg.below] then return end
tbl:tag('tr')
:tag('td')
:addClass(cfg.class.navbox_abovebelow)
:addClass(args[cfg.arg.belowclass])
:cssText(args[cfg.arg.basestyle])
:cssText(args[cfg.arg.belowstyle])
:attr('colspan', getAboveBelowColspan())
:tag('div')
:wikitext(processItem(args[cfg.arg.below], args[cfg.arg.nowrapitems]))
end
local function renderListRow(tbl, index, listnum, listnums_size)
local row = tbl:tag('tr')
if index == 1 and args[cfg.arg.imageleft] then
row
:tag('td')
:addClass(cfg.class.noviewer)
:addClass(cfg.class.navbox_image)
:addClass(args[cfg.arg.imageclass])
:css('width', '1px') -- Minimize width
:css('padding', '0 2px 0 0')
:cssText(args[cfg.arg.imageleftstyle])
:attr('rowspan', listnums_size)
:tag('div')
:wikitext(processItem(args[cfg.arg.imageleft]))
end
local group_and_num = format(cfg.arg.group_and_num, listnum)
local groupstyle_and_num = format(cfg.arg.groupstyle_and_num, listnum)
if args[group_and_num] then
local groupCell = row:tag('th')
-- id for aria-labelledby attribute, if lone group with no title or above
if listnum == 1 and not (args[cfg.arg.title] or args[cfg.arg.above] or args[cfg.arg.group2]) then
groupCell
:attr('id', mw.uri.anchorEncode(args[cfg.arg.group1]))
end
groupCell
:attr('scope', 'row')
:addClass(cfg.class.navbox_group)
:addClass(args[cfg.arg.groupclass])
:cssText(args[cfg.arg.basestyle])
-- If groupwidth not specified, minimize width
:css('width', args[cfg.arg.groupwidth] or '1%')
groupCell
:cssText(args[cfg.arg.groupstyle])
:cssText(args[groupstyle_and_num])
:wikitext(args[group_and_num])
end
local listCell = row:tag('td')
if args[group_and_num] then
listCell
:addClass(cfg.class.navbox_list_with_group)
else
listCell:attr('colspan', 2)
end
if not args[cfg.arg.groupwidth] then
listCell:css('width', '100%')
end
local rowstyle -- usually nil so cssText(rowstyle) usually adds nothing
if index % 2 == 1 then
rowstyle = args[cfg.arg.oddstyle]
else
rowstyle = args[cfg.arg.evenstyle]
end
local list_and_num = format(cfg.arg.list_and_num, listnum)
local listText = args[list_and_num]
local oddEven = cfg.marker.oddeven
if listText:sub(1, 12) == '</div><table' then
-- Assume list text is for a subgroup navbox so no automatic striping for this row.
oddEven = listText:find(cfg.pattern.navbox_title) and cfg.marker.restart or cfg.class.navbox_odd_part
end
local liststyle_and_num = format(cfg.arg.liststyle_and_num, listnum)
local listclass_and_num = format(cfg.arg.listclass_and_num, listnum)
listCell
:css('padding', '0')
:cssText(args[cfg.arg.liststyle])
:cssText(rowstyle)
:cssText(args[liststyle_and_num])
:addClass(cfg.class.navbox_list)
:addClass(cfg.class.navbox_part .. oddEven)
:addClass(args[cfg.arg.listclass])
:addClass(args[listclass_and_num])
:tag('div')
:css('padding',
(index == 1 and args[cfg.arg.list1padding]) or args[cfg.arg.listpadding] or '0 0.25em'
)
:wikitext(processItem(listText, args[cfg.arg.nowrapitems]))
if index == 1 and args[cfg.arg.image] then
row
:tag('td')
:addClass(cfg.class.noviewer)
:addClass(cfg.class.navbox_image)
:addClass(args[cfg.arg.imageclass])
:css('width', '1px') -- Minimize width
:css('padding', '0 0 0 2px')
:cssText(args[cfg.arg.imagestyle])
:attr('rowspan', listnums_size)
:tag('div')
:wikitext(processItem(args[cfg.arg.image]))
end
end
local function has_list_class(htmlclass)
local patterns = {
'^' .. htmlclass .. '$',
'%s' .. htmlclass .. '$',
'^' .. htmlclass .. '%s',
'%s' .. htmlclass .. '%s'
}
for arg, _ in pairs(args) do
if type(arg) == 'string' and mw.ustring.find(arg, cfg.pattern.class) then
for _, pattern in ipairs(patterns) do
if mw.ustring.find(args[arg] or '', pattern) then
return true
end
end
end
end
return false
end
-- there are a lot of list classes in the wild, so we add their TemplateStyles
local function add_list_styles()
local frame = mw.getCurrentFrame()
local function add_list_templatestyles(htmlclass, templatestyles)
if has_list_class(htmlclass) then
return frame:extensionTag{
name = 'templatestyles', args = { src = templatestyles }
}
else
return ''
end
end
local hlist_styles = add_list_templatestyles('hlist', cfg.hlist_templatestyles)
local plainlist_styles = add_list_templatestyles('plainlist', cfg.plainlist_templatestyles)
-- a second workaround for [[phab:T303378]]
-- when that issue is fixed, we can actually use has_navbar not to emit the
-- tag here if we want
if has_navbar() and hlist_styles == '' then
hlist_styles = frame:extensionTag{
name = 'templatestyles', args = { src = cfg.hlist_templatestyles }
}
end
-- hlist -> plainlist is best-effort to preserve old Common.css ordering.
-- this ordering is not a guarantee because most navboxes will emit only
-- one of these classes [hlist_note]
return hlist_styles .. plainlist_styles
end
local function needsHorizontalLists(border)
if border == cfg.keyword.border_subgroup or args[cfg.arg.tracking] == cfg.keyword.tracking_no then
return false
end
return not has_list_class(cfg.pattern.hlist) and not has_list_class(cfg.pattern.plainlist)
end
local function hasBackgroundColors()
for _, key in ipairs({cfg.arg.titlestyle, cfg.arg.groupstyle,
cfg.arg.basestyle, cfg.arg.abovestyle, cfg.arg.belowstyle}) do
if tostring(args[key]):find('background', 1, true) then
return true
end
end
return false
end
local function hasBorders()
for _, key in ipairs({cfg.arg.groupstyle, cfg.arg.basestyle,
cfg.arg.abovestyle, cfg.arg.belowstyle}) do
if tostring(args[key]):find('border', 1, true) then
return true
end
end
return false
end
local function isIllegible()
local styleratio = require('Module:Color contrast')._styleratio
for key, style in pairs(args) do
if tostring(key):match(cfg.pattern.style) then
if styleratio{mw.text.unstripNoWiki(style)} < 4.5 then
return true
end
end
end
return false
end
local function getTrackingCategories(border)
local cats = {}
if needsHorizontalLists(border) then table.insert(cats, cfg.category.horizontal_lists) end
if hasBackgroundColors() then table.insert(cats, cfg.category.background_colors) end
if isIllegible() then table.insert(cats, cfg.category.illegible) end
if hasBorders() then table.insert(cats, cfg.category.borders) end
return cats
end
local function renderTrackingCategories(builder, border)
local title = mw.title.getCurrentTitle()
if title.namespace ~= 10 then return end -- not in template space
local subpage = title.subpageText
if subpage == cfg.keyword.subpage_doc or subpage == cfg.keyword.subpage_sandbox
or subpage == cfg.keyword.subpage_testcases then return end
for _, cat in ipairs(getTrackingCategories(border)) do
builder:wikitext('[[Category:' .. cat .. ']]')
end
end
local function renderMainTable(border, listnums)
local tbl = mw.html.create('table')
:addClass(cfg.class.nowraplinks)
:addClass(args[cfg.arg.bodyclass])
local state = args[cfg.arg.state]
if args[cfg.arg.title] and state ~= cfg.keyword.state_plain and state ~= cfg.keyword.state_off then
if state == cfg.keyword.state_collapsed then
state = cfg.class.collapsed
end
tbl
:addClass(cfg.class.collapsible)
:addClass(state or cfg.class.autocollapse)
end
tbl:css('border-spacing', 0)
if border == cfg.keyword.border_subgroup or border == cfg.keyword.border_none then
tbl
:addClass(cfg.class.navbox_subgroup)
:cssText(args[cfg.arg.bodystyle])
:cssText(args[cfg.arg.style])
else -- regular navbox - bodystyle and style will be applied to the wrapper table
tbl
:addClass(cfg.class.navbox_inner)
:css('background', 'transparent')
:css('color', 'inherit')
end
tbl:cssText(args[cfg.arg.innerstyle])
renderTitleRow(tbl)
renderAboveRow(tbl)
local listnums_size = #listnums
for i, listnum in ipairs(listnums) do
renderListRow(tbl, i, listnum, listnums_size)
end
renderBelowRow(tbl)
return tbl
end
local function add_navbox_styles(hiding_templatestyles)
local frame = mw.getCurrentFrame()
-- This is a lambda so that it doesn't need the frame as a parameter
local function add_user_styles(templatestyles)
if templatestyles and templatestyles ~= '' then
return frame:extensionTag{
name = 'templatestyles', args = { src = templatestyles }
}
end
return ''
end
-- get templatestyles. load base from config so that Lua only needs to do
-- the work once of parser tag expansion
local base_templatestyles = cfg.templatestyles
local templatestyles = add_user_styles(args[cfg.arg.templatestyles])
local child_templatestyles = add_user_styles(args[cfg.arg.child_templatestyles])
-- The 'navbox-styles' div exists to wrap the styles to work around T200206
-- more elegantly. Instead of combinatorial rules, this ends up being linear
-- number of CSS rules.
return mw.html.create('div')
:addClass(cfg.class.navbox_styles)
:wikitext(
add_list_styles() .. -- see [hlist_note] applied to 'before base_templatestyles'
base_templatestyles ..
templatestyles ..
child_templatestyles ..
table.concat(hiding_templatestyles)
)
:done()
end
-- work around [[phab:T303378]]
-- for each arg: find all the templatestyles strip markers, insert them into a
-- table. then remove all templatestyles markers from the arg
local function move_hiding_templatestyles(args)
local gfind = string.gfind
local gsub = string.gsub
local templatestyles_markers = {}
local strip_marker_pattern = '(\127[^\127]*UNIQ%-%-templatestyles%-%x+%-QINU[^\127]*\127)'
for k, arg in pairs(args) do
for marker in gfind(arg, strip_marker_pattern) do
table.insert(templatestyles_markers, marker)
end
args[k] = gsub(arg, strip_marker_pattern, '')
end
return templatestyles_markers
end
function p._navbox(navboxArgs)
args = navboxArgs
local hiding_templatestyles = move_hiding_templatestyles(args)
local listnums = {}
for k, _ in pairs(args) do
if type(k) == 'string' then
local listnum = k:match(cfg.pattern.listnum)
if listnum then table.insert(listnums, tonumber(listnum)) end
end
end
table.sort(listnums)
local border = mw.text.trim(args[cfg.arg.border] or args[1] or '')
if border == cfg.keyword.border_child then
border = cfg.keyword.border_subgroup
end
-- render the main body of the navbox
local tbl = renderMainTable(border, listnums)
local res = mw.html.create()
-- render the appropriate wrapper for the navbox, based on the border param
if border == cfg.keyword.border_none then
res:node(add_navbox_styles(hiding_templatestyles))
local nav = res:tag('div')
:attr('role', 'navigation')
:node(tbl)
-- aria-labelledby title, otherwise above, otherwise lone group
if args[cfg.arg.title] or args[cfg.arg.above] or (args[cfg.arg.group1]
and not args[cfg.arg.group2]) then
nav:attr(
'aria-labelledby',
mw.uri.anchorEncode(
args[cfg.arg.title] or args[cfg.arg.above] or args[cfg.arg.group1]
)
)
else
nav:attr('aria-label', cfg.aria_label)
end
elseif border == cfg.keyword.border_subgroup then
-- We assume that this navbox is being rendered in a list cell of a
-- parent navbox, and is therefore inside a div with padding:0em 0.25em.
-- We start with a </div> to avoid the padding being applied, and at the
-- end add a <div> to balance out the parent's </div>
res
:wikitext('</div>')
:node(tbl)
:wikitext('<div>')
else
res:node(add_navbox_styles(hiding_templatestyles))
local nav = res:tag('div')
:attr('role', 'navigation')
:addClass(cfg.class.navbox)
:addClass(args[cfg.arg.navboxclass])
:cssText(args[cfg.arg.bodystyle])
:cssText(args[cfg.arg.style])
:css('padding', '3px')
:node(tbl)
-- aria-labelledby title, otherwise above, otherwise lone group
if args[cfg.arg.title] or args[cfg.arg.above]
or (args[cfg.arg.group1] and not args[cfg.arg.group2]) then
nav:attr(
'aria-labelledby',
mw.uri.anchorEncode(args[cfg.arg.title] or args[cfg.arg.above] or args[cfg.arg.group1])
)
else
nav:attr('aria-label', cfg.aria_label)
end
end
if (args[cfg.arg.nocat] or cfg.keyword.nocat_false):lower() == cfg.keyword.nocat_false then
renderTrackingCategories(res, border)
end
return striped(tostring(res), border)
end
function p.navbox(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
args = getArgs(frame, {wrappers = {cfg.pattern.navbox}})
-- Read the arguments in the order they'll be output in, to make references
-- number in the right order.
local _
_ = args[cfg.arg.title]
_ = args[cfg.arg.above]
-- Limit this to 20 as covering 'most' cases (that's a SWAG) and because
-- iterator approach won't work here
for i = 1, 20 do
_ = args[format(cfg.arg.group_and_num, i)]
_ = args[format(cfg.arg.list_and_num, i)]
end
_ = args[cfg.arg.below]
return p._navbox(args)
end
return p
05be9a97c035ab3f0fac69423779e261949d473c
Template:High-use
10
78
115
2023-05-30T09:39:48Z
wikipedia>Lectonar
0
Changed protection settings for "[[Template:High-use]]": [[WP:High-risk templates|High-risk template or module]] ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))
wikitext
text/x-wiki
{{#invoke:High-use|main|1={{{1|}}}|2={{{2|}}}|info={{{info|}}}|demo={{{demo|}}}|form={{{form|}}}|expiry={{{expiry|}}}|system={{{system|}}}}}<noinclude>
{{Documentation}}
<!-- Add categories to the /doc subpage; interwiki links go to Wikidata, thank you! -->
</noinclude>
a3322d1bd47ac03df14fa2090855cff4fede9bc7
Module:Transclusion count
828
80
119
2023-05-30T20:51:38Z
wikipedia>Isabelle Belato
0
Changed protection settings for "[[Module:Transclusion count]]": [[WP:High-risk templates|Highly visible template]]; requested at [[WP:RfPP]] ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))
Scribunto
text/plain
local p = {}
function p.fetch(frame)
local template = nil
local return_value = nil
-- Use demo parameter if it exists, otherswise use current template name
local namespace = mw.title.getCurrentTitle().namespace
if frame.args["demo"] and frame.args["demo"] ~= "" then
template = mw.ustring.gsub(frame.args["demo"],"^[Tt]emplate:","")
elseif namespace == 10 then -- Template namespace
template = mw.title.getCurrentTitle().text
elseif namespace == 828 then -- Module namespace
template = (mw.site.namespaces[828].name .. ":" .. mw.title.getCurrentTitle().text)
end
-- If in template or module namespace, look up count in /data
if template ~= nil then
namespace = mw.title.new(template, "Template").namespace
if namespace == 10 or namespace == 828 then
template = mw.ustring.gsub(template, "/doc$", "") -- strip /doc from end
template = mw.ustring.gsub(template, "/sandbox$", "") -- strip /sandbox from end
local index = mw.ustring.sub(mw.title.new(template).text,1,1)
local status, data = pcall(function ()
return(mw.loadData('Module:Transclusion_count/data/' .. (mw.ustring.find(index, "%a") and index or "other")))
end)
if status then
return_value = tonumber(data[mw.ustring.gsub(template, " ", "_")])
end
end
end
-- If database value doesn't exist, use value passed to template
if return_value == nil and frame.args[1] ~= nil then
local arg1=mw.ustring.match(frame.args[1], '[%d,]+')
if arg1 and arg1 ~= '' then
return_value = tonumber(frame:callParserFunction('formatnum', arg1, 'R'))
end
end
return return_value
end
-- Tabulate this data for [[Wikipedia:Database reports/Templates transcluded on the most pages]]
function p.tabulate(frame)
local list = {}
for i = 65, 91 do
local data = mw.loadData('Module:Transclusion count/data/' .. ((i == 91) and 'other' or string.char(i)))
for name, count in pairs(data) do
table.insert(list, {mw.title.new(name, "Template").fullText, count})
end
end
table.sort(list, function(a, b)
return (a[2] == b[2]) and (a[1] < b[1]) or (a[2] > b[2])
end)
local lang = mw.getContentLanguage();
for i = 1, #list do
list[i] = ('|-\n| %d || [[%s]] || %s\n'):format(i, list[i][1]:gsub('_', ' '), lang:formatNum(list[i][2]))
end
return table.concat(list)
end
return p
000ef6bcbf7b66e727870b0c300c4009da300513
Template:Navbox suite
10
141
241
2023-06-23T20:58:18Z
wikipedia>Andrybak
0
categorization
wikitext
text/x-wiki
{{#invoke:sidebar|sidebar
| width = auto
| bodystyle = border-spacing:0;background:#f7f7f7;padding:2px;
| title = Navbox suite
| titlestyle = padding: 0.2em 0.8em; font-size: 145%; line-height: 1.2em; background-color: #ccf;
| contentclass = plainlist
| contentstyle = padding:0.25em;background:#fdfdfd;
| content1 =
*{{tl|Navbox}}
*{{tl|Navbox with collapsible groups}}
*{{tl|Navbox with columns}}
*{{tl|Navboxes}}
| navbarstyle = background:#fdfdfd;padding:0 5px
}}<!--
NOTE: A template MUST support all of the parameters marked with a cross in Template:Navbox/doc in order to be Navbox suite compliant.
In particular, the name, state, border, and navbar parameters are especially important.
--><noinclude>
{{Documentation|content=
Helper template for linking between main navbox templates in their documentation.
[[Category:Wikipedia-internal sidebar templates]]
[[Category:Navbox meta-templates|Δ]]<!-- Δ for documentation ([[WP:SORTKEY]]) -->
[[Category:Documentation see also templates]]
}}
</noinclude>
1c4315eaad3857aa3fcc7a7bb9d24c989e20e19f
Template:Navigation templates
10
144
247
2023-08-29T10:05:25Z
wikipedia>Andrybak
0
use [[Module:Navbox/styles.css]]
wikitext
text/x-wiki
<templatestyles src="Module:Navbox/styles.css" />
{| class="wikitable" style="margin-left: auto; margin-right: auto; text-align: center;"
|+ Navigation templates comparison {{Navbar|Navigation templates|plain=1|brackets=y}}
|-
! Template
! Collapsible !! Header color
! Image !! Groups !! Style (body) <br /> parameter/s
|-
| style="text-align: left;" | {{tl|Navbox}}
| collapsible || class="navbox-title" | navbox
| Left/right of body || Yes || Yes
|-
| style="text-align: left;" | {{tl|Navbox with collapsible groups}}
| collapsible || class="navbox-title" | navbox
| Left/right of body and/or in each list || Yes || Yes
|-
| style="text-align: left;" | {{tl|Navbox with columns}}
| collapsible || class="navbox-title" | navbox
| Left/right of columns || No || Yes
|}
{| class="wikitable" style="margin-left: auto; margin-right: auto; text-align: center;"
|+ Collapsible attributes
|-
! Type !! CSS classes !! JavaScript !! Collapses when !! Custom <br /> initial state !! Nesting
|-
| style="text-align:left;" | [[Help:Collapsing|Collapsible tables]]
| mw-collapsible
| Defined in [[MediaWiki:Common.js|Common.js]]
| 2 or more autocollapse on page || Yes || Yes
|}<noinclude>
[[Category:Navbox meta-templates|Δ]]
[[Category:Documentation shared content templates]]
</noinclude>
3532432c7f57704faf211932139c393f1bc2b912
Module:Message box
828
51
62
2023-09-02T22:54:30Z
wikipedia>Anomie
0
[[:File:Cscr-featured.svg]] needs a link to the description page for license and attribution. Add the ability for the configuration to specify a flag to accomplish this.
Scribunto
text/plain
require('strict')
local getArgs
local yesno = require('Module:Yesno')
local lang = mw.language.getContentLanguage()
local CONFIG_MODULE = 'Module:Message box/configuration'
local DEMOSPACES = {talk = 'tmbox', image = 'imbox', file = 'imbox', category = 'cmbox', article = 'ambox', main = 'ambox'}
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function getTitleObject(...)
-- Get the title object, passing the function through pcall
-- in case we are over the expensive function count limit.
local success, title = pcall(mw.title.new, ...)
if success then
return title
end
end
local function union(t1, t2)
-- Returns the union of two arrays.
local vals = {}
for i, v in ipairs(t1) do
vals[v] = true
end
for i, v in ipairs(t2) do
vals[v] = true
end
local ret = {}
for k in pairs(vals) do
table.insert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(args, prefix)
local nums = {}
for k, v in pairs(args) do
local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
if num then
table.insert(nums, tonumber(num))
end
end
table.sort(nums)
return nums
end
--------------------------------------------------------------------------------
-- Box class definition
--------------------------------------------------------------------------------
local MessageBox = {}
MessageBox.__index = MessageBox
function MessageBox.new(boxType, args, cfg)
args = args or {}
local obj = {}
-- Set the title object and the namespace.
obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle()
-- Set the config for our box type.
obj.cfg = cfg[boxType]
if not obj.cfg then
local ns = obj.title.namespace
-- boxType is "mbox" or invalid input
if args.demospace and args.demospace ~= '' then
-- implement demospace parameter of mbox
local demospace = string.lower(args.demospace)
if DEMOSPACES[demospace] then
-- use template from DEMOSPACES
obj.cfg = cfg[DEMOSPACES[demospace]]
elseif string.find( demospace, 'talk' ) then
-- demo as a talk page
obj.cfg = cfg.tmbox
else
-- default to ombox
obj.cfg = cfg.ombox
end
elseif ns == 0 then
obj.cfg = cfg.ambox -- main namespace
elseif ns == 6 then
obj.cfg = cfg.imbox -- file namespace
elseif ns == 14 then
obj.cfg = cfg.cmbox -- category namespace
else
local nsTable = mw.site.namespaces[ns]
if nsTable and nsTable.isTalk then
obj.cfg = cfg.tmbox -- any talk namespace
else
obj.cfg = cfg.ombox -- other namespaces or invalid input
end
end
end
-- Set the arguments, and remove all blank arguments except for the ones
-- listed in cfg.allowBlankParams.
do
local newArgs = {}
for k, v in pairs(args) do
if v ~= '' then
newArgs[k] = v
end
end
for i, param in ipairs(obj.cfg.allowBlankParams or {}) do
newArgs[param] = args[param]
end
obj.args = newArgs
end
-- Define internal data structure.
obj.categories = {}
obj.classes = {}
-- For lazy loading of [[Module:Category handler]].
obj.hasCategories = false
return setmetatable(obj, MessageBox)
end
function MessageBox:addCat(ns, cat, sort)
if not cat then
return nil
end
if sort then
cat = string.format('[[Category:%s|%s]]', cat, sort)
else
cat = string.format('[[Category:%s]]', cat)
end
self.hasCategories = true
self.categories[ns] = self.categories[ns] or {}
table.insert(self.categories[ns], cat)
end
function MessageBox:addClass(class)
if not class then
return nil
end
table.insert(self.classes, class)
end
function MessageBox:setParameters()
local args = self.args
local cfg = self.cfg
-- Get type data.
self.type = args.type
local typeData = cfg.types[self.type]
self.invalidTypeError = cfg.showInvalidTypeError
and self.type
and not typeData
typeData = typeData or cfg.types[cfg.default]
self.typeClass = typeData.class
self.typeImage = typeData.image
self.typeImageNeedsLink = typeData.imageNeedsLink
-- Find if the box has been wrongly substituted.
self.isSubstituted = cfg.substCheck and args.subst == 'SUBST'
-- Find whether we are using a small message box.
self.isSmall = cfg.allowSmall and (
cfg.smallParam and args.small == cfg.smallParam
or not cfg.smallParam and yesno(args.small)
)
-- Add attributes, classes and styles.
self.id = args.id
self.name = args.name
if self.name then
self:addClass('box-' .. string.gsub(self.name,' ','_'))
end
if yesno(args.plainlinks) ~= false then
self:addClass('plainlinks')
end
for _, class in ipairs(cfg.classes or {}) do
self:addClass(class)
end
if self.isSmall then
self:addClass(cfg.smallClass or 'mbox-small')
end
self:addClass(self.typeClass)
self:addClass(args.class)
self.style = args.style
self.attrs = args.attrs
-- Set text style.
self.textstyle = args.textstyle
-- Find if we are on the template page or not. This functionality is only
-- used if useCollapsibleTextFields is set, or if both cfg.templateCategory
-- and cfg.templateCategoryRequireName are set.
self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
if self.useCollapsibleTextFields
or cfg.templateCategory
and cfg.templateCategoryRequireName
then
if self.name then
local templateName = mw.ustring.match(
self.name,
'^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$'
) or self.name
templateName = 'Template:' .. templateName
self.templateTitle = getTitleObject(templateName)
end
self.isTemplatePage = self.templateTitle
and mw.title.equals(self.title, self.templateTitle)
end
-- Process data for collapsible text fields. At the moment these are only
-- used in {{ambox}}.
if self.useCollapsibleTextFields then
-- Get the self.issue value.
if self.isSmall and args.smalltext then
self.issue = args.smalltext
else
local sect
if args.sect == '' then
sect = 'This ' .. (cfg.sectionDefault or 'page')
elseif type(args.sect) == 'string' then
sect = 'This ' .. args.sect
end
local issue = args.issue
issue = type(issue) == 'string' and issue ~= '' and issue or nil
local text = args.text
text = type(text) == 'string' and text or nil
local issues = {}
table.insert(issues, sect)
table.insert(issues, issue)
table.insert(issues, text)
self.issue = table.concat(issues, ' ')
end
-- Get the self.talk value.
local talk = args.talk
-- Show talk links on the template page or template subpages if the talk
-- parameter is blank.
if talk == ''
and self.templateTitle
and (
mw.title.equals(self.templateTitle, self.title)
or self.title:isSubpageOf(self.templateTitle)
)
then
talk = '#'
elseif talk == '' then
talk = nil
end
if talk then
-- If the talk value is a talk page, make a link to that page. Else
-- assume that it's a section heading, and make a link to the talk
-- page of the current page with that section heading.
local talkTitle = getTitleObject(talk)
local talkArgIsTalkPage = true
if not talkTitle or not talkTitle.isTalkPage then
talkArgIsTalkPage = false
talkTitle = getTitleObject(
self.title.text,
mw.site.namespaces[self.title.namespace].talk.id
)
end
if talkTitle and talkTitle.exists then
local talkText
if self.isSmall then
local talkLink = talkArgIsTalkPage and talk or (talkTitle.prefixedText .. '#' .. talk)
talkText = string.format('([[%s|talk]])', talkLink)
else
talkText = 'Relevant discussion may be found on'
if talkArgIsTalkPage then
talkText = string.format(
'%s [[%s|%s]].',
talkText,
talk,
talkTitle.prefixedText
)
else
talkText = string.format(
'%s the [[%s#%s|talk page]].',
talkText,
talkTitle.prefixedText,
talk
)
end
end
self.talk = talkText
end
end
-- Get other values.
self.fix = args.fix ~= '' and args.fix or nil
local date
if args.date and args.date ~= '' then
date = args.date
elseif args.date == '' and self.isTemplatePage then
date = lang:formatDate('F Y')
end
if date then
self.date = string.format(" <span class='date-container'><i>(<span class='date'>%s</span>)</i></span>", date)
end
self.info = args.info
if yesno(args.removalnotice) then
self.removalNotice = cfg.removalNotice
end
end
-- Set the non-collapsible text field. At the moment this is used by all box
-- types other than ambox, and also by ambox when small=yes.
if self.isSmall then
self.text = args.smalltext or args.text
else
self.text = args.text
end
-- Set the below row.
self.below = cfg.below and args.below
-- General image settings.
self.imageCellDiv = not self.isSmall and cfg.imageCellDiv
self.imageEmptyCell = cfg.imageEmptyCell
-- Left image settings.
local imageLeft = self.isSmall and args.smallimage or args.image
if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
or not cfg.imageCheckBlank and imageLeft ~= 'none'
then
self.imageLeft = imageLeft
if not imageLeft then
local imageSize = self.isSmall
and (cfg.imageSmallSize or '30x30px')
or '40x40px'
self.imageLeft = string.format('[[File:%s|%s%s|alt=]]', self.typeImage
or 'Information icon4.svg', imageSize, self.typeImageNeedsLink and "" or "|link=" )
end
end
-- Right image settings.
local imageRight = self.isSmall and args.smallimageright or args.imageright
if not (cfg.imageRightNone and imageRight == 'none') then
self.imageRight = imageRight
end
-- set templatestyles
self.base_templatestyles = cfg.templatestyles
self.templatestyles = args.templatestyles
end
function MessageBox:setMainspaceCategories()
local args = self.args
local cfg = self.cfg
if not cfg.allowMainspaceCategories then
return nil
end
local nums = {}
for _, prefix in ipairs{'cat', 'category', 'all'} do
args[prefix .. '1'] = args[prefix]
nums = union(nums, getArgNums(args, prefix))
end
-- The following is roughly equivalent to the old {{Ambox/category}}.
local date = args.date
date = type(date) == 'string' and date
local preposition = 'from'
for _, num in ipairs(nums) do
local mainCat = args['cat' .. tostring(num)]
or args['category' .. tostring(num)]
local allCat = args['all' .. tostring(num)]
mainCat = type(mainCat) == 'string' and mainCat
allCat = type(allCat) == 'string' and allCat
if mainCat and date and date ~= '' then
local catTitle = string.format('%s %s %s', mainCat, preposition, date)
self:addCat(0, catTitle)
catTitle = getTitleObject('Category:' .. catTitle)
if not catTitle or not catTitle.exists then
self:addCat(0, 'Articles with invalid date parameter in template')
end
elseif mainCat and (not date or date == '') then
self:addCat(0, mainCat)
end
if allCat then
self:addCat(0, allCat)
end
end
end
function MessageBox:setTemplateCategories()
local args = self.args
local cfg = self.cfg
-- Add template categories.
if cfg.templateCategory then
if cfg.templateCategoryRequireName then
if self.isTemplatePage then
self:addCat(10, cfg.templateCategory)
end
elseif not self.title.isSubpage then
self:addCat(10, cfg.templateCategory)
end
end
-- Add template error categories.
if cfg.templateErrorCategory then
local templateErrorCategory = cfg.templateErrorCategory
local templateCat, templateSort
if not self.name and not self.title.isSubpage then
templateCat = templateErrorCategory
elseif self.isTemplatePage then
local paramsToCheck = cfg.templateErrorParamsToCheck or {}
local count = 0
for i, param in ipairs(paramsToCheck) do
if not args[param] then
count = count + 1
end
end
if count > 0 then
templateCat = templateErrorCategory
templateSort = tostring(count)
end
if self.categoryNums and #self.categoryNums > 0 then
templateCat = templateErrorCategory
templateSort = 'C'
end
end
self:addCat(10, templateCat, templateSort)
end
end
function MessageBox:setAllNamespaceCategories()
-- Set categories for all namespaces.
if self.invalidTypeError then
local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText
self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
end
if self.isSubstituted then
self:addCat('all', 'Pages with incorrectly substituted templates')
end
end
function MessageBox:setCategories()
if self.title.namespace == 0 then
self:setMainspaceCategories()
elseif self.title.namespace == 10 then
self:setTemplateCategories()
end
self:setAllNamespaceCategories()
end
function MessageBox:renderCategories()
if not self.hasCategories then
-- No categories added, no need to pass them to Category handler so,
-- if it was invoked, it would return the empty string.
-- So we shortcut and return the empty string.
return ""
end
-- Convert category tables to strings and pass them through
-- [[Module:Category handler]].
return require('Module:Category handler')._main{
main = table.concat(self.categories[0] or {}),
template = table.concat(self.categories[10] or {}),
all = table.concat(self.categories.all or {}),
nocat = self.args.nocat,
page = self.args.page
}
end
function MessageBox:export()
local root = mw.html.create()
-- Add the subst check error.
if self.isSubstituted and self.name then
root:tag('b')
:addClass('error')
:wikitext(string.format(
'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
))
end
local frame = mw.getCurrentFrame()
root:wikitext(frame:extensionTag{
name = 'templatestyles',
args = { src = self.base_templatestyles },
})
-- Add support for a single custom templatestyles sheet. Undocumented as
-- need should be limited and many templates using mbox are substed; we
-- don't want to spread templatestyles sheets around to arbitrary places
if self.templatestyles then
root:wikitext(frame:extensionTag{
name = 'templatestyles',
args = { src = self.templatestyles },
})
end
-- Create the box table.
local boxTable = root:tag('table')
boxTable:attr('id', self.id or nil)
for i, class in ipairs(self.classes or {}) do
boxTable:addClass(class or nil)
end
boxTable
:cssText(self.style or nil)
:attr('role', 'presentation')
if self.attrs then
boxTable:attr(self.attrs)
end
-- Add the left-hand image.
local row = boxTable:tag('tr')
if self.imageLeft then
local imageLeftCell = row:tag('td'):addClass('mbox-image')
if self.imageCellDiv then
-- If we are using a div, redefine imageLeftCell so that the image
-- is inside it. Divs use style="width: 52px;", which limits the
-- image width to 52px. If any images in a div are wider than that,
-- they may overlap with the text or cause other display problems.
imageLeftCell = imageLeftCell:tag('div'):addClass('mbox-image-div')
end
imageLeftCell:wikitext(self.imageLeft or nil)
elseif self.imageEmptyCell then
-- Some message boxes define an empty cell if no image is specified, and
-- some don't. The old template code in templates where empty cells are
-- specified gives the following hint: "No image. Cell with some width
-- or padding necessary for text cell to have 100% width."
row:tag('td')
:addClass('mbox-empty-cell')
end
-- Add the text.
local textCell = row:tag('td'):addClass('mbox-text')
if self.useCollapsibleTextFields then
-- The message box uses advanced text parameters that allow things to be
-- collapsible. At the moment, only ambox uses this.
textCell:cssText(self.textstyle or nil)
local textCellDiv = textCell:tag('div')
textCellDiv
:addClass('mbox-text-span')
:wikitext(self.issue or nil)
if (self.talk or self.fix) then
textCellDiv:tag('span')
:addClass('hide-when-compact')
:wikitext(self.talk and (' ' .. self.talk) or nil)
:wikitext(self.fix and (' ' .. self.fix) or nil)
end
textCellDiv:wikitext(self.date and (' ' .. self.date) or nil)
if self.info and not self.isSmall then
textCellDiv
:tag('span')
:addClass('hide-when-compact')
:wikitext(self.info and (' ' .. self.info) or nil)
end
if self.removalNotice then
textCellDiv:tag('span')
:addClass('hide-when-compact')
:tag('i')
:wikitext(string.format(" (%s)", self.removalNotice))
end
else
-- Default text formatting - anything goes.
textCell
:cssText(self.textstyle or nil)
:wikitext(self.text or nil)
end
-- Add the right-hand image.
if self.imageRight then
local imageRightCell = row:tag('td'):addClass('mbox-imageright')
if self.imageCellDiv then
-- If we are using a div, redefine imageRightCell so that the image
-- is inside it.
imageRightCell = imageRightCell:tag('div'):addClass('mbox-image-div')
end
imageRightCell
:wikitext(self.imageRight or nil)
end
-- Add the below row.
if self.below then
boxTable:tag('tr')
:tag('td')
:attr('colspan', self.imageRight and '3' or '2')
:addClass('mbox-text')
:cssText(self.textstyle or nil)
:wikitext(self.below or nil)
end
-- Add error message for invalid type parameters.
if self.invalidTypeError then
root:tag('div')
:addClass('mbox-invalid-type')
:wikitext(string.format(
'This message box is using an invalid "type=%s" parameter and needs fixing.',
self.type or ''
))
end
-- Add categories.
root:wikitext(self:renderCategories() or nil)
return tostring(root)
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p, mt = {}, {}
function p._exportClasses()
-- For testing.
return {
MessageBox = MessageBox
}
end
function p.main(boxType, args, cfgTables)
local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE))
box:setParameters()
box:setCategories()
return box:export()
end
function mt.__index(t, k)
return function (frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
return t.main(k, getArgs(frame, {trim = false, removeBlanks = false}))
end
end
return setmetatable(p, mt)
f2fb84f7b817d2d88747f57c40902a0d8be8158a
Module:Navbar
828
62
83
2023-10-10T22:34:57Z
wikipedia>Pppery
0
Per edit request on talk
Scribunto
text/plain
local p = {}
local cfg = mw.loadData('Module:Navbar/configuration')
local function get_title_arg(is_collapsible, template)
local title_arg = 1
if is_collapsible then title_arg = 2 end
if template then title_arg = 'template' end
return title_arg
end
local function choose_links(template, args)
-- The show table indicates the default displayed items.
-- view, talk, edit, hist, move, watch
-- TODO: Move to configuration.
local show = {true, true, true, false, false, false}
if template then
show[2] = false
show[3] = false
local index = {t = 2, d = 2, e = 3, h = 4, m = 5, w = 6,
talk = 2, edit = 3, hist = 4, move = 5, watch = 6}
-- TODO: Consider removing TableTools dependency.
for _, v in ipairs(require ('Module:TableTools').compressSparseArray(args)) do
local num = index[v]
if num then show[num] = true end
end
end
local remove_edit_link = args.noedit
if remove_edit_link then show[3] = false end
return show
end
local function add_link(link_description, ul, is_mini, font_style)
local l
if link_description.url then
l = {'[', '', ']'}
else
l = {'[[', '|', ']]'}
end
ul:tag('li')
:addClass('nv-' .. link_description.full)
:wikitext(l[1] .. link_description.link .. l[2])
:tag(is_mini and 'abbr' or 'span')
:attr('title', link_description.html_title)
:cssText(font_style)
:wikitext(is_mini and link_description.mini or link_description.full)
:done()
:wikitext(l[3])
:done()
end
local function make_list(title_text, has_brackets, displayed_links, is_mini, font_style)
local title = mw.title.new(mw.text.trim(title_text), cfg.title_namespace)
if not title then
error(cfg.invalid_title .. title_text)
end
local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or ''
-- TODO: Get link_descriptions and show into the configuration module.
-- link_descriptions should be easier...
local link_descriptions = {
{ ['mini'] = 'v', ['full'] = 'view', ['html_title'] = 'View this template',
['link'] = title.fullText, ['url'] = false },
{ ['mini'] = 't', ['full'] = 'talk', ['html_title'] = 'Discuss this template',
['link'] = talkpage, ['url'] = false },
{ ['mini'] = 'e', ['full'] = 'edit', ['html_title'] = 'Edit this template',
['link'] = 'Special:EditPage/' .. title.fullText, ['url'] = false },
{ ['mini'] = 'h', ['full'] = 'hist', ['html_title'] = 'History of this template',
['link'] = 'Special:PageHistory/' .. title.fullText, ['url'] = false },
{ ['mini'] = 'm', ['full'] = 'move', ['html_title'] = 'Move this template',
['link'] = mw.title.new('Special:Movepage'):fullUrl('target='..title.fullText), ['url'] = true },
{ ['mini'] = 'w', ['full'] = 'watch', ['html_title'] = 'Watch this template',
['link'] = title:fullUrl('action=watch'), ['url'] = true }
}
local ul = mw.html.create('ul')
if has_brackets then
ul:addClass(cfg.classes.brackets)
:cssText(font_style)
end
for i, _ in ipairs(displayed_links) do
if displayed_links[i] then add_link(link_descriptions[i], ul, is_mini, font_style) end
end
return ul:done()
end
function p._navbar(args)
-- TODO: We probably don't need both fontstyle and fontcolor...
local font_style = args.fontstyle
local font_color = args.fontcolor
local is_collapsible = args.collapsible
local is_mini = args.mini
local is_plain = args.plain
local collapsible_class = nil
if is_collapsible then
collapsible_class = cfg.classes.collapsible
if not is_plain then is_mini = 1 end
if font_color then
font_style = (font_style or '') .. '; color: ' .. font_color .. ';'
end
end
local navbar_style = args.style
local div = mw.html.create():tag('div')
div
:addClass(cfg.classes.navbar)
:addClass(cfg.classes.plainlinks)
:addClass(cfg.classes.horizontal_list)
:addClass(collapsible_class) -- we made the determination earlier
:cssText(navbar_style)
if is_mini then div:addClass(cfg.classes.mini) end
local box_text = (args.text or cfg.box_text) .. ' '
-- the concatenated space guarantees the box text is separated
if not (is_mini or is_plain) then
div
:tag('span')
:addClass(cfg.classes.box_text)
:cssText(font_style)
:wikitext(box_text)
end
local template = args.template
local displayed_links = choose_links(template, args)
local has_brackets = args.brackets
local title_arg = get_title_arg(is_collapsible, template)
local title_text = args[title_arg] or (':' .. mw.getCurrentFrame():getParent():getTitle())
local list = make_list(title_text, has_brackets, displayed_links, is_mini, font_style)
div:node(list)
if is_collapsible then
local title_text_class
if is_mini then
title_text_class = cfg.classes.collapsible_title_mini
else
title_text_class = cfg.classes.collapsible_title_full
end
div:done()
:tag('div')
:addClass(title_text_class)
:cssText(font_style)
:wikitext(args[1])
end
local frame = mw.getCurrentFrame()
-- hlist -> navbar is best-effort to preserve old Common.css ordering.
return frame:extensionTag{
name = 'templatestyles', args = { src = cfg.hlist_templatestyles }
} .. frame:extensionTag{
name = 'templatestyles', args = { src = cfg.templatestyles }
} .. tostring(div:done())
end
function p.navbar(frame)
return p._navbar(require('Module:Arguments').getArgs(frame))
end
return p
047f307758c878eb3e99ed1768cc40920a6ec5fa
Module:String
828
54
67
2023-10-25T18:17:50Z
wikipedia>Trappist the monk
0
Scribunto
text/plain
--[[
This module is intended to provide access to basic string functions.
Most of the functions provided here can be invoked with named parameters,
unnamed parameters, or a mixture. If named parameters are used, Mediawiki will
automatically remove any leading or trailing whitespace from the parameter.
Depending on the intended use, it may be advantageous to either preserve or
remove such whitespace.
Global options
ignore_errors: If set to 'true' or 1, any error condition will result in
an empty string being returned rather than an error message.
error_category: If an error occurs, specifies the name of a category to
include with the error message. The default category is
[Category:Errors reported by Module String].
no_category: If set to 'true' or 1, no category will be added if an error
is generated.
Unit tests for this module are available at Module:String/tests.
]]
local str = {}
--[[
len
This function returns the length of the target string.
Usage:
{{#invoke:String|len|target_string|}}
OR
{{#invoke:String|len|s=target_string}}
Parameters
s: The string whose length to report
If invoked using named parameters, Mediawiki will automatically remove any leading or
trailing whitespace from the target string.
]]
function str.len( frame )
local new_args = str._getParameters( frame.args, {'s'} )
local s = new_args['s'] or ''
return mw.ustring.len( s )
end
--[[
sub
This function returns a substring of the target string at specified indices.
Usage:
{{#invoke:String|sub|target_string|start_index|end_index}}
OR
{{#invoke:String|sub|s=target_string|i=start_index|j=end_index}}
Parameters
s: The string to return a subset of
i: The first index of the substring to return, defaults to 1.
j: The last index of the string to return, defaults to the last character.
The first character of the string is assigned an index of 1. If either i or j
is a negative value, it is interpreted the same as selecting a character by
counting from the end of the string. Hence, a value of -1 is the same as
selecting the last character of the string.
If the requested indices are out of range for the given string, an error is
reported.
]]
function str.sub( frame )
local new_args = str._getParameters( frame.args, { 's', 'i', 'j' } )
local s = new_args['s'] or ''
local i = tonumber( new_args['i'] ) or 1
local j = tonumber( new_args['j'] ) or -1
local len = mw.ustring.len( s )
-- Convert negatives for range checking
if i < 0 then
i = len + i + 1
end
if j < 0 then
j = len + j + 1
end
if i > len or j > len or i < 1 or j < 1 then
return str._error( 'String subset index out of range' )
end
if j < i then
return str._error( 'String subset indices out of order' )
end
return mw.ustring.sub( s, i, j )
end
--[[
This function implements that features of {{str sub old}} and is kept in order
to maintain these older templates.
]]
function str.sublength( frame )
local i = tonumber( frame.args.i ) or 0
local len = tonumber( frame.args.len )
return mw.ustring.sub( frame.args.s, i + 1, len and ( i + len ) )
end
--[[
_match
This function returns a substring from the source string that matches a
specified pattern. It is exported for use in other modules
Usage:
strmatch = require("Module:String")._match
sresult = strmatch( s, pattern, start, match, plain, nomatch )
Parameters
s: The string to search
pattern: The pattern or string to find within the string
start: The index within the source string to start the search. The first
character of the string has index 1. Defaults to 1.
match: In some cases it may be possible to make multiple matches on a single
string. This specifies which match to return, where the first match is
match= 1. If a negative number is specified then a match is returned
counting from the last match. Hence match = -1 is the same as requesting
the last match. Defaults to 1.
plain: A flag indicating that the pattern should be understood as plain
text. Defaults to false.
nomatch: If no match is found, output the "nomatch" value rather than an error.
For information on constructing Lua patterns, a form of [regular expression], see:
* http://www.lua.org/manual/5.1/manual.html#5.4.1
* http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Patterns
* http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Ustring_patterns
]]
-- This sub-routine is exported for use in other modules
function str._match( s, pattern, start, match_index, plain_flag, nomatch )
if s == '' then
return str._error( 'Target string is empty' )
end
if pattern == '' then
return str._error( 'Pattern string is empty' )
end
start = tonumber(start) or 1
if math.abs(start) < 1 or math.abs(start) > mw.ustring.len( s ) then
return str._error( 'Requested start is out of range' )
end
if match_index == 0 then
return str._error( 'Match index is out of range' )
end
if plain_flag then
pattern = str._escapePattern( pattern )
end
local result
if match_index == 1 then
-- Find first match is simple case
result = mw.ustring.match( s, pattern, start )
else
if start > 1 then
s = mw.ustring.sub( s, start )
end
local iterator = mw.ustring.gmatch(s, pattern)
if match_index > 0 then
-- Forward search
for w in iterator do
match_index = match_index - 1
if match_index == 0 then
result = w
break
end
end
else
-- Reverse search
local result_table = {}
local count = 1
for w in iterator do
result_table[count] = w
count = count + 1
end
result = result_table[ count + match_index ]
end
end
if result == nil then
if nomatch == nil then
return str._error( 'Match not found' )
else
return nomatch
end
else
return result
end
end
--[[
match
This function returns a substring from the source string that matches a
specified pattern.
Usage:
{{#invoke:String|match|source_string|pattern_string|start_index|match_number|plain_flag|nomatch_output}}
OR
{{#invoke:String|match|s=source_string|pattern=pattern_string|start=start_index
|match=match_number|plain=plain_flag|nomatch=nomatch_output}}
Parameters
s: The string to search
pattern: The pattern or string to find within the string
start: The index within the source string to start the search. The first
character of the string has index 1. Defaults to 1.
match: In some cases it may be possible to make multiple matches on a single
string. This specifies which match to return, where the first match is
match= 1. If a negative number is specified then a match is returned
counting from the last match. Hence match = -1 is the same as requesting
the last match. Defaults to 1.
plain: A flag indicating that the pattern should be understood as plain
text. Defaults to false.
nomatch: If no match is found, output the "nomatch" value rather than an error.
If invoked using named parameters, Mediawiki will automatically remove any leading or
trailing whitespace from each string. In some circumstances this is desirable, in
other cases one may want to preserve the whitespace.
If the match_number or start_index are out of range for the string being queried, then
this function generates an error. An error is also generated if no match is found.
If one adds the parameter ignore_errors=true, then the error will be suppressed and
an empty string will be returned on any failure.
For information on constructing Lua patterns, a form of [regular expression], see:
* http://www.lua.org/manual/5.1/manual.html#5.4.1
* http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Patterns
* http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Ustring_patterns
]]
-- This is the entry point for #invoke:String|match
function str.match( frame )
local new_args = str._getParameters( frame.args, {'s', 'pattern', 'start', 'match', 'plain', 'nomatch'} )
local s = new_args['s'] or ''
local start = tonumber( new_args['start'] ) or 1
local plain_flag = str._getBoolean( new_args['plain'] or false )
local pattern = new_args['pattern'] or ''
local match_index = math.floor( tonumber(new_args['match']) or 1 )
local nomatch = new_args['nomatch']
return str._match( s, pattern, start, match_index, plain_flag, nomatch )
end
--[[
pos
This function returns a single character from the target string at position pos.
Usage:
{{#invoke:String|pos|target_string|index_value}}
OR
{{#invoke:String|pos|target=target_string|pos=index_value}}
Parameters
target: The string to search
pos: The index for the character to return
If invoked using named parameters, Mediawiki will automatically remove any leading or
trailing whitespace from the target string. In some circumstances this is desirable, in
other cases one may want to preserve the whitespace.
The first character has an index value of 1.
If one requests a negative value, this function will select a character by counting backwards
from the end of the string. In other words pos = -1 is the same as asking for the last character.
A requested value of zero, or a value greater than the length of the string returns an error.
]]
function str.pos( frame )
local new_args = str._getParameters( frame.args, {'target', 'pos'} )
local target_str = new_args['target'] or ''
local pos = tonumber( new_args['pos'] ) or 0
if pos == 0 or math.abs(pos) > mw.ustring.len( target_str ) then
return str._error( 'String index out of range' )
end
return mw.ustring.sub( target_str, pos, pos )
end
--[[
str_find
This function duplicates the behavior of {{str_find}}, including all of its quirks.
This is provided in order to support existing templates, but is NOT RECOMMENDED for
new code and templates. New code is recommended to use the "find" function instead.
Returns the first index in "source" that is a match to "target". Indexing is 1-based,
and the function returns -1 if the "target" string is not present in "source".
Important Note: If the "target" string is empty / missing, this function returns a
value of "1", which is generally unexpected behavior, and must be accounted for
separatetly.
]]
function str.str_find( frame )
local new_args = str._getParameters( frame.args, {'source', 'target'} )
local source_str = new_args['source'] or ''
local target_str = new_args['target'] or ''
if target_str == '' then
return 1
end
local start = mw.ustring.find( source_str, target_str, 1, true )
if start == nil then
start = -1
end
return start
end
--[[
find
This function allows one to search for a target string or pattern within another
string.
Usage:
{{#invoke:String|find|source_str|target_string|start_index|plain_flag}}
OR
{{#invoke:String|find|source=source_str|target=target_str|start=start_index|plain=plain_flag}}
Parameters
source: The string to search
target: The string or pattern to find within source
start: The index within the source string to start the search, defaults to 1
plain: Boolean flag indicating that target should be understood as plain
text and not as a Lua style regular expression, defaults to true
If invoked using named parameters, Mediawiki will automatically remove any leading or
trailing whitespace from the parameter. In some circumstances this is desirable, in
other cases one may want to preserve the whitespace.
This function returns the first index >= "start" where "target" can be found
within "source". Indices are 1-based. If "target" is not found, then this
function returns 0. If either "source" or "target" are missing / empty, this
function also returns 0.
This function should be safe for UTF-8 strings.
]]
function str.find( frame )
local new_args = str._getParameters( frame.args, {'source', 'target', 'start', 'plain' } )
local source_str = new_args['source'] or ''
local pattern = new_args['target'] or ''
local start_pos = tonumber(new_args['start']) or 1
local plain = new_args['plain'] or true
if source_str == '' or pattern == '' then
return 0
end
plain = str._getBoolean( plain )
local start = mw.ustring.find( source_str, pattern, start_pos, plain )
if start == nil then
start = 0
end
return start
end
--[[
replace
This function allows one to replace a target string or pattern within another
string.
Usage:
{{#invoke:String|replace|source_str|pattern_string|replace_string|replacement_count|plain_flag}}
OR
{{#invoke:String|replace|source=source_string|pattern=pattern_string|replace=replace_string|
count=replacement_count|plain=plain_flag}}
Parameters
source: The string to search
pattern: The string or pattern to find within source
replace: The replacement text
count: The number of occurences to replace, defaults to all.
plain: Boolean flag indicating that pattern should be understood as plain
text and not as a Lua style regular expression, defaults to true
]]
function str.replace( frame )
local new_args = str._getParameters( frame.args, {'source', 'pattern', 'replace', 'count', 'plain' } )
local source_str = new_args['source'] or ''
local pattern = new_args['pattern'] or ''
local replace = new_args['replace'] or ''
local count = tonumber( new_args['count'] )
local plain = new_args['plain'] or true
if source_str == '' or pattern == '' then
return source_str
end
plain = str._getBoolean( plain )
if plain then
pattern = str._escapePattern( pattern )
replace = mw.ustring.gsub( replace, "%%", "%%%%" ) --Only need to escape replacement sequences.
end
local result
if count ~= nil then
result = mw.ustring.gsub( source_str, pattern, replace, count )
else
result = mw.ustring.gsub( source_str, pattern, replace )
end
return result
end
--[[
simple function to pipe string.rep to templates.
]]
function str.rep( frame )
local repetitions = tonumber( frame.args[2] )
if not repetitions then
return str._error( 'function rep expects a number as second parameter, received "' .. ( frame.args[2] or '' ) .. '"' )
end
return string.rep( frame.args[1] or '', repetitions )
end
--[[
escapePattern
This function escapes special characters from a Lua string pattern. See [1]
for details on how patterns work.
[1] https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Patterns
Usage:
{{#invoke:String|escapePattern|pattern_string}}
Parameters
pattern_string: The pattern string to escape.
]]
function str.escapePattern( frame )
local pattern_str = frame.args[1]
if not pattern_str then
return str._error( 'No pattern string specified' )
end
local result = str._escapePattern( pattern_str )
return result
end
--[[
count
This function counts the number of occurrences of one string in another.
]]
function str.count(frame)
local args = str._getParameters(frame.args, {'source', 'pattern', 'plain'})
local source = args.source or ''
local pattern = args.pattern or ''
local plain = str._getBoolean(args.plain or true)
if plain then
pattern = str._escapePattern(pattern)
end
local _, count = mw.ustring.gsub(source, pattern, '')
return count
end
--[[
endswith
This function determines whether a string ends with another string.
]]
function str.endswith(frame)
local args = str._getParameters(frame.args, {'source', 'pattern'})
local source = args.source or ''
local pattern = args.pattern or ''
if pattern == '' then
-- All strings end with the empty string.
return "yes"
end
if mw.ustring.sub(source, -mw.ustring.len(pattern), -1) == pattern then
return "yes"
else
return ""
end
end
--[[
join
Join all non empty arguments together; the first argument is the separator.
Usage:
{{#invoke:String|join|sep|one|two|three}}
]]
function str.join(frame)
local args = {}
local sep
for _, v in ipairs( frame.args ) do
if sep then
if v ~= '' then
table.insert(args, v)
end
else
sep = v
end
end
return table.concat( args, sep or '' )
end
--[[
Helper function that populates the argument list given that user may need to use a mix of
named and unnamed parameters. This is relevant because named parameters are not
identical to unnamed parameters due to string trimming, and when dealing with strings
we sometimes want to either preserve or remove that whitespace depending on the application.
]]
function str._getParameters( frame_args, arg_list )
local new_args = {}
local index = 1
local value
for _, arg in ipairs( arg_list ) do
value = frame_args[arg]
if value == nil then
value = frame_args[index]
index = index + 1
end
new_args[arg] = value
end
return new_args
end
--[[
Helper function to handle error messages.
]]
function str._error( error_str )
local frame = mw.getCurrentFrame()
local error_category = frame.args.error_category or 'Errors reported by Module String'
local ignore_errors = frame.args.ignore_errors or false
local no_category = frame.args.no_category or false
if str._getBoolean(ignore_errors) then
return ''
end
local error_str = '<strong class="error">String Module Error: ' .. error_str .. '</strong>'
if error_category ~= '' and not str._getBoolean( no_category ) then
error_str = '[[Category:' .. error_category .. ']]' .. error_str
end
return error_str
end
--[[
Helper Function to interpret boolean strings
]]
function str._getBoolean( boolean_str )
local boolean_value
if type( boolean_str ) == 'string' then
boolean_str = boolean_str:lower()
if boolean_str == 'false' or boolean_str == 'no' or boolean_str == '0'
or boolean_str == '' then
boolean_value = false
else
boolean_value = true
end
elseif type( boolean_str ) == 'boolean' then
boolean_value = boolean_str
else
error( 'No boolean value found' )
end
return boolean_value
end
--[[
Helper function that escapes all pattern characters so that they will be treated
as plain text.
]]
function str._escapePattern( pattern_str )
return mw.ustring.gsub( pattern_str, "([%(%)%.%%%+%-%*%?%[%^%$%]])", "%%%1" )
end
return str
2ad0905c56ef4955950b75a8f00974fe82aed5e4
Module:Documentation/config
828
74
107
2023-10-28T01:25:16Z
wikipedia>Pppery
0
Split [[Category:Templates sandboxes]] per CfD
Scribunto
text/plain
----------------------------------------------------------------------------------------------------
--
-- Configuration for Module:Documentation
--
-- Here you can set the values of the parameters and messages used in Module:Documentation to
-- localise it to your wiki and your language. Unless specified otherwise, values given here
-- should be string values.
----------------------------------------------------------------------------------------------------
local cfg = {} -- Do not edit this line.
----------------------------------------------------------------------------------------------------
-- Protection template configuration
----------------------------------------------------------------------------------------------------
-- cfg['protection-reason-edit']
-- The protection reason for edit-protected templates to pass to
-- [[Module:Protection banner]].
cfg['protection-reason-edit'] = 'template'
--[[
----------------------------------------------------------------------------------------------------
-- Sandbox notice configuration
--
-- On sandbox pages the module can display a template notifying users that the current page is a
-- sandbox, and the location of test cases pages, etc. The module decides whether the page is a
-- sandbox or not based on the value of cfg['sandbox-subpage']. The following settings configure the
-- messages that the notices contains.
----------------------------------------------------------------------------------------------------
--]]
-- cfg['sandbox-notice-image']
-- The image displayed in the sandbox notice.
cfg['sandbox-notice-image'] = '[[File:Sandbox.svg|50px|alt=|link=]]'
--[[
-- cfg['sandbox-notice-pagetype-template']
-- cfg['sandbox-notice-pagetype-module']
-- cfg['sandbox-notice-pagetype-other']
-- The page type of the sandbox page. The message that is displayed depends on the current subject
-- namespace. This message is used in either cfg['sandbox-notice-blurb'] or
-- cfg['sandbox-notice-diff-blurb'].
--]]
cfg['sandbox-notice-pagetype-template'] = '[[Wikipedia:Template test cases|template sandbox]] page'
cfg['sandbox-notice-pagetype-module'] = '[[Wikipedia:Template test cases|module sandbox]] page'
cfg['sandbox-notice-pagetype-other'] = 'sandbox page'
--[[
-- cfg['sandbox-notice-blurb']
-- cfg['sandbox-notice-diff-blurb']
-- cfg['sandbox-notice-diff-display']
-- Either cfg['sandbox-notice-blurb'] or cfg['sandbox-notice-diff-blurb'] is the opening sentence
-- of the sandbox notice. The latter has a diff link, but the former does not. $1 is the page
-- type, which is either cfg['sandbox-notice-pagetype-template'],
-- cfg['sandbox-notice-pagetype-module'] or cfg['sandbox-notice-pagetype-other'] depending what
-- namespace we are in. $2 is a link to the main template page, and $3 is a diff link between
-- the sandbox and the main template. The display value of the diff link is set by
-- cfg['sandbox-notice-compare-link-display'].
--]]
cfg['sandbox-notice-blurb'] = 'This is the $1 for $2.'
cfg['sandbox-notice-diff-blurb'] = 'This is the $1 for $2 ($3).'
cfg['sandbox-notice-compare-link-display'] = 'diff'
--[[
-- cfg['sandbox-notice-testcases-blurb']
-- cfg['sandbox-notice-testcases-link-display']
-- cfg['sandbox-notice-testcases-run-blurb']
-- cfg['sandbox-notice-testcases-run-link-display']
-- cfg['sandbox-notice-testcases-blurb'] is a sentence notifying the user that there is a test cases page
-- corresponding to this sandbox that they can edit. $1 is a link to the test cases page.
-- cfg['sandbox-notice-testcases-link-display'] is the display value for that link.
-- cfg['sandbox-notice-testcases-run-blurb'] is a sentence notifying the user that there is a test cases page
-- corresponding to this sandbox that they can edit, along with a link to run it. $1 is a link to the test
-- cases page, and $2 is a link to the page to run it.
-- cfg['sandbox-notice-testcases-run-link-display'] is the display value for the link to run the test
-- cases.
--]]
cfg['sandbox-notice-testcases-blurb'] = 'See also the companion subpage for $1.'
cfg['sandbox-notice-testcases-link-display'] = 'test cases'
cfg['sandbox-notice-testcases-run-blurb'] = 'See also the companion subpage for $1 ($2).'
cfg['sandbox-notice-testcases-run-link-display'] = 'run'
-- cfg['sandbox-category'] - A category to add to all template sandboxes.
-- cfg['module-sandbox-category'] - A category to add to all module sandboxes.
-- cfg['module-sandbox-category'] - A category to add to all sandboxe not in templates or modules.
cfg['sandbox-category'] = 'Template sandboxes'
cfg['module-sandbox-category'] = 'Module sandboxes'
cfg['other-sandbox-category'] = 'Sandboxes outside of template or module namespace'
----------------------------------------------------------------------------------------------------
-- Start box configuration
----------------------------------------------------------------------------------------------------
-- cfg['documentation-icon-wikitext']
-- The wikitext for the icon shown at the top of the template.
cfg['documentation-icon-wikitext'] = '[[File:Test Template Info-Icon - Version (2).svg|50px|link=|alt=]]'
-- cfg['template-namespace-heading']
-- The heading shown in the template namespace.
cfg['template-namespace-heading'] = 'Template documentation'
-- cfg['module-namespace-heading']
-- The heading shown in the module namespace.
cfg['module-namespace-heading'] = 'Module documentation'
-- cfg['file-namespace-heading']
-- The heading shown in the file namespace.
cfg['file-namespace-heading'] = 'Summary'
-- cfg['other-namespaces-heading']
-- The heading shown in other namespaces.
cfg['other-namespaces-heading'] = 'Documentation'
-- cfg['view-link-display']
-- The text to display for "view" links.
cfg['view-link-display'] = 'view'
-- cfg['edit-link-display']
-- The text to display for "edit" links.
cfg['edit-link-display'] = 'edit'
-- cfg['history-link-display']
-- The text to display for "history" links.
cfg['history-link-display'] = 'history'
-- cfg['purge-link-display']
-- The text to display for "purge" links.
cfg['purge-link-display'] = 'purge'
-- cfg['create-link-display']
-- The text to display for "create" links.
cfg['create-link-display'] = 'create'
----------------------------------------------------------------------------------------------------
-- Link box (end box) configuration
----------------------------------------------------------------------------------------------------
-- cfg['transcluded-from-blurb']
-- Notice displayed when the docs are transcluded from another page. $1 is a wikilink to that page.
cfg['transcluded-from-blurb'] = 'The above [[Wikipedia:Template documentation|documentation]] is [[Help:Transclusion|transcluded]] from $1.'
--[[
-- cfg['create-module-doc-blurb']
-- Notice displayed in the module namespace when the documentation subpage does not exist.
-- $1 is a link to create the documentation page with the preload cfg['module-preload'] and the
-- display cfg['create-link-display'].
--]]
cfg['create-module-doc-blurb'] = 'You might want to $1 a documentation page for this [[Wikipedia:Lua|Scribunto module]].'
----------------------------------------------------------------------------------------------------
-- Experiment blurb configuration
----------------------------------------------------------------------------------------------------
--[[
-- cfg['experiment-blurb-template']
-- cfg['experiment-blurb-module']
-- The experiment blurb is the text inviting editors to experiment in sandbox and test cases pages.
-- It is only shown in the template and module namespaces. With the default English settings, it
-- might look like this:
--
-- Editors can experiment in this template's sandbox (edit | diff) and testcases (edit) pages.
--
-- In this example, "sandbox", "edit", "diff", "testcases", and "edit" would all be links.
--
-- There are two versions, cfg['experiment-blurb-template'] and cfg['experiment-blurb-module'], depending
-- on what namespace we are in.
--
-- Parameters:
--
-- $1 is a link to the sandbox page. If the sandbox exists, it is in the following format:
--
-- cfg['sandbox-link-display'] (cfg['sandbox-edit-link-display'] | cfg['compare-link-display'])
--
-- If the sandbox doesn't exist, it is in the format:
--
-- cfg['sandbox-link-display'] (cfg['sandbox-create-link-display'] | cfg['mirror-link-display'])
--
-- The link for cfg['sandbox-create-link-display'] link preloads the page with cfg['template-sandbox-preload']
-- or cfg['module-sandbox-preload'], depending on the current namespace. The link for cfg['mirror-link-display']
-- loads a default edit summary of cfg['mirror-edit-summary'].
--
-- $2 is a link to the test cases page. If the test cases page exists, it is in the following format:
--
-- cfg['testcases-link-display'] (cfg['testcases-edit-link-display'] | cfg['testcases-run-link-display'])
--
-- If the test cases page doesn't exist, it is in the format:
--
-- cfg['testcases-link-display'] (cfg['testcases-create-link-display'])
--
-- If the test cases page doesn't exist, the link for cfg['testcases-create-link-display'] preloads the
-- page with cfg['template-testcases-preload'] or cfg['module-testcases-preload'], depending on the current
-- namespace.
--]]
cfg['experiment-blurb-template'] = "Editors can experiment in this template's $1 and $2 pages."
cfg['experiment-blurb-module'] = "Editors can experiment in this module's $1 and $2 pages."
----------------------------------------------------------------------------------------------------
-- Sandbox link configuration
----------------------------------------------------------------------------------------------------
-- cfg['sandbox-subpage']
-- The name of the template subpage typically used for sandboxes.
cfg['sandbox-subpage'] = 'sandbox'
-- cfg['template-sandbox-preload']
-- Preload file for template sandbox pages.
cfg['template-sandbox-preload'] = 'Template:Documentation/preload-sandbox'
-- cfg['module-sandbox-preload']
-- Preload file for Lua module sandbox pages.
cfg['module-sandbox-preload'] = 'Template:Documentation/preload-module-sandbox'
-- cfg['sandbox-link-display']
-- The text to display for "sandbox" links.
cfg['sandbox-link-display'] = 'sandbox'
-- cfg['sandbox-edit-link-display']
-- The text to display for sandbox "edit" links.
cfg['sandbox-edit-link-display'] = 'edit'
-- cfg['sandbox-create-link-display']
-- The text to display for sandbox "create" links.
cfg['sandbox-create-link-display'] = 'create'
-- cfg['compare-link-display']
-- The text to display for "compare" links.
cfg['compare-link-display'] = 'diff'
-- cfg['mirror-edit-summary']
-- The default edit summary to use when a user clicks the "mirror" link. $1 is a wikilink to the
-- template page.
cfg['mirror-edit-summary'] = 'Create sandbox version of $1'
-- cfg['mirror-link-display']
-- The text to display for "mirror" links.
cfg['mirror-link-display'] = 'mirror'
-- cfg['mirror-link-preload']
-- The page to preload when a user clicks the "mirror" link.
cfg['mirror-link-preload'] = 'Template:Documentation/mirror'
----------------------------------------------------------------------------------------------------
-- Test cases link configuration
----------------------------------------------------------------------------------------------------
-- cfg['testcases-subpage']
-- The name of the template subpage typically used for test cases.
cfg['testcases-subpage'] = 'testcases'
-- cfg['template-testcases-preload']
-- Preload file for template test cases pages.
cfg['template-testcases-preload'] = 'Template:Documentation/preload-testcases'
-- cfg['module-testcases-preload']
-- Preload file for Lua module test cases pages.
cfg['module-testcases-preload'] = 'Template:Documentation/preload-module-testcases'
-- cfg['testcases-link-display']
-- The text to display for "testcases" links.
cfg['testcases-link-display'] = 'testcases'
-- cfg['testcases-edit-link-display']
-- The text to display for test cases "edit" links.
cfg['testcases-edit-link-display'] = 'edit'
-- cfg['testcases-run-link-display']
-- The text to display for test cases "run" links.
cfg['testcases-run-link-display'] = 'run'
-- cfg['testcases-create-link-display']
-- The text to display for test cases "create" links.
cfg['testcases-create-link-display'] = 'create'
----------------------------------------------------------------------------------------------------
-- Add categories blurb configuration
----------------------------------------------------------------------------------------------------
--[[
-- cfg['add-categories-blurb']
-- Text to direct users to add categories to the /doc subpage. Not used if the "content" or
-- "docname fed" arguments are set, as then it is not clear where to add the categories. $1 is a
-- link to the /doc subpage with a display value of cfg['doc-link-display'].
--]]
cfg['add-categories-blurb'] = 'Add categories to the $1 subpage.'
-- cfg['doc-link-display']
-- The text to display when linking to the /doc subpage.
cfg['doc-link-display'] = '/doc'
----------------------------------------------------------------------------------------------------
-- Subpages link configuration
----------------------------------------------------------------------------------------------------
--[[
-- cfg['subpages-blurb']
-- The "Subpages of this template" blurb. $1 is a link to the main template's subpages with a
-- display value of cfg['subpages-link-display']. In the English version this blurb is simply
-- the link followed by a period, and the link display provides the actual text.
--]]
cfg['subpages-blurb'] = '$1.'
--[[
-- cfg['subpages-link-display']
-- The text to display for the "subpages of this page" link. $1 is cfg['template-pagetype'],
-- cfg['module-pagetype'] or cfg['default-pagetype'], depending on whether the current page is in
-- the template namespace, the module namespace, or another namespace.
--]]
cfg['subpages-link-display'] = 'Subpages of this $1'
-- cfg['template-pagetype']
-- The pagetype to display for template pages.
cfg['template-pagetype'] = 'template'
-- cfg['module-pagetype']
-- The pagetype to display for Lua module pages.
cfg['module-pagetype'] = 'module'
-- cfg['default-pagetype']
-- The pagetype to display for pages other than templates or Lua modules.
cfg['default-pagetype'] = 'page'
----------------------------------------------------------------------------------------------------
-- Doc link configuration
----------------------------------------------------------------------------------------------------
-- cfg['doc-subpage']
-- The name of the subpage typically used for documentation pages.
cfg['doc-subpage'] = 'doc'
-- cfg['docpage-preload']
-- Preload file for template documentation pages in all namespaces.
cfg['docpage-preload'] = 'Template:Documentation/preload'
-- cfg['module-preload']
-- Preload file for Lua module documentation pages.
cfg['module-preload'] = 'Template:Documentation/preload-module-doc'
----------------------------------------------------------------------------------------------------
-- HTML and CSS configuration
----------------------------------------------------------------------------------------------------
-- cfg['templatestyles']
-- The name of the TemplateStyles page where CSS is kept.
-- Sandbox CSS will be at Module:Documentation/sandbox/styles.css when needed.
cfg['templatestyles'] = 'Module:Documentation/styles.css'
-- cfg['container']
-- Class which can be used to set flex or grid CSS on the
-- two child divs documentation and documentation-metadata
cfg['container'] = 'documentation-container'
-- cfg['main-div-classes']
-- Classes added to the main HTML "div" tag.
cfg['main-div-classes'] = 'documentation'
-- cfg['main-div-heading-class']
-- Class for the main heading for templates and modules and assoc. talk spaces
cfg['main-div-heading-class'] = 'documentation-heading'
-- cfg['start-box-class']
-- Class for the start box
cfg['start-box-class'] = 'documentation-startbox'
-- cfg['start-box-link-classes']
-- Classes used for the [view][edit][history] or [create] links in the start box.
-- mw-editsection-like is per [[Wikipedia:Village pump (technical)/Archive 117]]
cfg['start-box-link-classes'] = 'mw-editsection-like plainlinks'
-- cfg['end-box-class']
-- Class for the end box.
cfg['end-box-class'] = 'documentation-metadata'
-- cfg['end-box-plainlinks']
-- Plainlinks
cfg['end-box-plainlinks'] = 'plainlinks'
-- cfg['toolbar-class']
-- Class added for toolbar links.
cfg['toolbar-class'] = 'documentation-toolbar'
-- cfg['clear']
-- Just used to clear things.
cfg['clear'] = 'documentation-clear'
----------------------------------------------------------------------------------------------------
-- Tracking category configuration
----------------------------------------------------------------------------------------------------
-- cfg['display-strange-usage-category']
-- Set to true to enable output of cfg['strange-usage-category'] if the module is used on a /doc subpage
-- or a /testcases subpage. This should be a boolean value (either true or false).
cfg['display-strange-usage-category'] = true
-- cfg['strange-usage-category']
-- Category to output if cfg['display-strange-usage-category'] is set to true and the module is used on a
-- /doc subpage or a /testcases subpage.
cfg['strange-usage-category'] = 'Wikipedia pages with strange ((documentation)) usage'
--[[
----------------------------------------------------------------------------------------------------
-- End configuration
--
-- Don't edit anything below this line.
----------------------------------------------------------------------------------------------------
--]]
return cfg
56b6127664e31128dea1cecf2e392cf9313df6a3
Module:Navbox/doc
828
95
149
2023-11-10T23:44:58Z
wikipedia>Pppery
0
No longer used in system messages
wikitext
text/x-wiki
{{high use}}
{{module rating|protected}}
{{Lua|Module:Navbox/configuration|Module:Navbar|Module:Color contrast|Module:Arguments}}
{{Uses TemplateStyles|Module:Navbox/styles.css|Template:Plainlist/styles.css|Template:Hlist/styles.css}}
{{Lua sidebar}}
This module implements the {{tl|Navbox}} template. Please see the [[Template:Navbox|template page]] for usage instructions.
== Tracking/maintenance categories ==
* {{clc|Navbox orphans}}
* {{clc|Navigational boxes without horizontal lists}}
* {{clc|Navboxes using background colours}}
* {{clc|Potentially illegible navboxes}}
* {{clc|Navboxes using borders}}
<includeonly>{{sandbox other||
[[Category:Modules that add a tracking category]]
[[Category:Modules that check for strip markers]]
}}</includeonly>
5abb15d141e269f9d660b73b3fa4391779c7684f
Module:Hatnote list
828
114
187
2023-11-13T21:00:31Z
wikipedia>Nihiltres
0
Updated from sandbox: added support for punctuation collapse when text is italicized. The update's content includes changes by users Johnuniq, Dexxor, and Nihiltres.
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Module:Hatnote list --
-- --
-- This module produces and formats lists for use in hatnotes. In particular, --
-- it implements the for-see list, i.e. lists of "For X, see Y" statements, --
-- as used in {{about}}, {{redirect}}, and their variants. Also introduced --
-- are andList & orList helpers for formatting lists with those conjunctions. --
--------------------------------------------------------------------------------
local mArguments --initialize lazily
local mFormatLink = require('Module:Format link')
local mHatnote = require('Module:Hatnote')
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local p = {}
--------------------------------------------------------------------------------
-- List stringification helper functions
--
-- These functions are used for stringifying lists, usually page lists inside
-- the "Y" portion of "For X, see Y" for-see items.
--------------------------------------------------------------------------------
--default options table used across the list stringification functions
local stringifyListDefaultOptions = {
conjunction = "and",
separator = ",",
altSeparator = ";",
space = " ",
formatted = false
}
--Searches display text only
local function searchDisp(haystack, needle)
return string.find(
string.sub(haystack, (string.find(haystack, '|') or 0) + 1), needle
)
end
-- Stringifies a list generically; probably shouldn't be used directly
local function stringifyList(list, options)
-- Type-checks, defaults, and a shortcut
checkType("stringifyList", 1, list, "table")
if #list == 0 then return nil end
checkType("stringifyList", 2, options, "table", true)
options = options or {}
for k, v in pairs(stringifyListDefaultOptions) do
if options[k] == nil then options[k] = v end
end
local s = options.space
-- Format the list if requested
if options.formatted then
list = mFormatLink.formatPages(
{categorizeMissing = mHatnote.missingTargetCat}, list
)
end
-- Set the separator; if any item contains it, use the alternate separator
local separator = options.separator
for k, v in pairs(list) do
if searchDisp(v, separator) then
separator = options.altSeparator
break
end
end
-- Set the conjunction, apply Oxford comma, and force a comma if #1 has "§"
local conjunction = s .. options.conjunction .. s
if #list == 2 and searchDisp(list[1], "§") or #list > 2 then
conjunction = separator .. conjunction
end
-- Return the formatted string
return mw.text.listToText(list, separator .. s, conjunction)
end
--DRY function
function p.conjList (conj, list, fmt)
return stringifyList(list, {conjunction = conj, formatted = fmt})
end
-- Stringifies lists with "and" or "or"
function p.andList (...) return p.conjList("and", ...) end
function p.orList (...) return p.conjList("or", ...) end
--------------------------------------------------------------------------------
-- For see
--
-- Makes a "For X, see [[Y]]." list from raw parameters. Intended for the
-- {{about}} and {{redirect}} templates and their variants.
--------------------------------------------------------------------------------
--default options table used across the forSee family of functions
local forSeeDefaultOptions = {
andKeyword = 'and',
title = mw.title.getCurrentTitle().text,
otherText = 'other uses',
forSeeForm = 'For %s, see %s.',
}
--Collapses duplicate punctuation at end of string, ignoring italics and links
local function punctuationCollapse (text)
return text:match("[.?!]('?)%1(%]?)%2%.$") and text:sub(1, -2) or text
end
-- Structures arguments into a table for stringification, & options
function p.forSeeArgsToTable (args, from, options)
-- Type-checks and defaults
checkType("forSeeArgsToTable", 1, args, 'table')
checkType("forSeeArgsToTable", 2, from, 'number', true)
from = from or 1
checkType("forSeeArgsToTable", 3, options, 'table', true)
options = options or {}
for k, v in pairs(forSeeDefaultOptions) do
if options[k] == nil then options[k] = v end
end
-- maxArg's gotten manually because getArgs() and table.maxn aren't friends
local maxArg = 0
for k, v in pairs(args) do
if type(k) == 'number' and k > maxArg then maxArg = k end
end
-- Structure the data out from the parameter list:
-- * forTable is the wrapper table, with forRow rows
-- * Rows are tables of a "use" string & a "pages" table of pagename strings
-- * Blanks are left empty for defaulting elsewhere, but can terminate list
local forTable = {}
local i = from
local terminated = false
-- If there is extra text, and no arguments are given, give nil value
-- to not produce default of "For other uses, see foo (disambiguation)"
if options.extratext and i > maxArg then return nil end
-- Loop to generate rows
repeat
-- New empty row
local forRow = {}
-- On blank use, assume list's ended & break at end of this loop
forRow.use = args[i]
if not args[i] then terminated = true end
-- New empty list of pages
forRow.pages = {}
-- Insert first pages item if present
table.insert(forRow.pages, args[i + 1])
-- If the param after next is "and", do inner loop to collect params
-- until the "and"'s stop. Blanks are ignored: "1|and||and|3" → {1, 3}
while args[i + 2] == options.andKeyword do
if args[i + 3] then
table.insert(forRow.pages, args[i + 3])
end
-- Increment to next "and"
i = i + 2
end
-- Increment to next use
i = i + 2
-- Append the row
table.insert(forTable, forRow)
until terminated or i > maxArg
return forTable
end
-- Stringifies a table as formatted by forSeeArgsToTable
function p.forSeeTableToString (forSeeTable, options)
-- Type-checks and defaults
checkType("forSeeTableToString", 1, forSeeTable, "table", true)
checkType("forSeeTableToString", 2, options, "table", true)
options = options or {}
for k, v in pairs(forSeeDefaultOptions) do
if options[k] == nil then options[k] = v end
end
-- Stringify each for-see item into a list
local strList = {}
if forSeeTable then
for k, v in pairs(forSeeTable) do
local useStr = v.use or options.otherText
local pagesStr =
p.andList(v.pages, true) or
mFormatLink._formatLink{
categorizeMissing = mHatnote.missingTargetCat,
link = mHatnote.disambiguate(options.title)
}
local forSeeStr = string.format(options.forSeeForm, useStr, pagesStr)
forSeeStr = punctuationCollapse(forSeeStr)
table.insert(strList, forSeeStr)
end
end
if options.extratext then table.insert(strList, punctuationCollapse(options.extratext..'.')) end
-- Return the concatenated list
return table.concat(strList, ' ')
end
-- Produces a "For X, see [[Y]]" string from arguments. Expects index gaps
-- but not blank/whitespace values. Ignores named args and args < "from".
function p._forSee (args, from, options)
local forSeeTable = p.forSeeArgsToTable(args, from, options)
return p.forSeeTableToString(forSeeTable, options)
end
-- As _forSee, but uses the frame.
function p.forSee (frame, from, options)
mArguments = require('Module:Arguments')
return p._forSee(mArguments.getArgs(frame), from, options)
end
return p
1c8e6212115f76ecc3db8d05137011cd18207988
Template:As of
10
118
195
2023-11-19T18:05:59Z
wikipedia>Pppery
0
Per [[Wikipedia:Village pump (technical)#Dated maintenance categories "as of" the future or the past]]
wikitext
text/x-wiki
<!--{{As of}} begin--><includeonly><!--
## param 1 is the year
## optional param 2 is the month
## optional param 3 is the day of the month
## optional named parameter alt=[text] is alternative display text (may include wiki markup)
## optional named parameter df=US produces American date format in displayed text
## optional named parameter lc=on gives lower-case-first output
## optional named parameter url=[URL] gives statement reference
## displayed text ([A/a]s of [Start date] by default)
-->{{#if: {{{alt|}}} | {{{alt}}} | {{#if:{{{bare|}}}||{{#if:{{yesno|{{{since|}}}}}|{{#if: {{yesno|{{{lc|}}}}} | s | S }}ince | {{#if: {{yesno|{{{lc|}}}}} | a | A }}s of}}}} {{#if:{{{pre|}}}|{{{pre}}} }}{{#if: {{{3|}}} | {{#ifeq:{{lc:{{{df|}}}}}|us|{{MONTHNAME|{{{2}}}}} {{#expr:{{{3}}}}}, |{{#expr:{{{3}}}}} {{MONTHNAME|{{{2}}}}} }}{{{1}}}|{{#if: {{{2|}}} |{{MONTHNAME|{{{2}}}}} }}{{{1}}}}}}}{{#if:{{{post|}}}|<nowiki />{{{post}}}}}<!--
#### That nowiki is required or, various characters (:, ;, #, and *} will be parsed as wikisyntax for list items.
## ref/update inline banner (hidden by default)
--><sup class="plainlinks noexcerpt noprint asof-tag {{#if:{{{url|}}}|ref|update}}" style="display:none;">[{{#if:{{{url|}}}|{{{url}}} [ref]|{{fullurl:{{PAGENAME}}|action=edit}} [update]}}]</sup><!--
## categorisation disabled outside main namespace
-->{{DMCA|Articles containing potentially dated statements|from|<!--
## temporal category for template (word method)
-->{{#if: {{#ifexpr: {{{1}}} = 1 }} |{{#ifexpr:{{#time:U|{{{1}}}}} > {{#time:U}} | the future | {{#ifexpr: {{#time:Y|{{{1}}}}} > 2004 | {{{1}}} | {{#ifexpr: {{#time:Y|{{{1}}}}} > 1989 | {{#time:Y|{{{1}}}}} | before 1990 }}}}}} |<!--
## temporal category for template (parameter method)
-->{{#ifexpr: {{{1}}} > 2004 | {{#ifexpr:{{#time:U|{{#if:{{{2|}}} | {{MONTHNAME|{{{2}}}}}}} {{{1}}}}} > {{#time:U}} | the future| {{#if:{{{2|}}} | {{MONTHNAME|{{{2}}}}} }} {{{1}}}}} | {{#ifexpr:{{{1}}} > 1989 | {{{1}}} | before 1990 }}}}}}|<!--
## global category for template
-->All articles containing potentially dated statements}}</includeonly><!--{{As of}} end--><noinclude><!--
## dynamic example (as of today, self ref)
-->{{As of|{{CURRENTYEAR}}|{{CURRENTMONTH}}|{{CURRENTDAY}}}}<sup class="plainlinks">[https://en.wikipedia.org/wiki/Template:As_of [ref]]</sup>
{{documentation}}
<!-- Add categories and inter-wikis to the /doc subpage, not here! -->
</noinclude>{{#invoke:Check for unknown parameters|check|unknown={{main other|[[Category:Pages using as of template with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:As of]] with unknown parameter "_VALUE_"|ignoreblank=y| 1 | 2 | 3 | alt | bare | df | lc | post | pre | since | url }}
91770030e512861a99e4376b0513e1b12cc99ff7
Module:Message box/configuration
828
52
63
2023-11-24T02:41:46Z
wikipedia>Pppery
0
Per edit request
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Message box configuration --
-- --
-- This module contains configuration data for [[Module:Message box]]. --
--------------------------------------------------------------------------------
return {
ambox = {
types = {
speedy = {
class = 'ambox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'ambox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'ambox-content',
image = 'Ambox important.svg'
},
style = {
class = 'ambox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ambox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'ambox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'ambox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
allowBlankParams = {'talk', 'sect', 'date', 'issue', 'fix', 'subst', 'hidden'},
allowSmall = true,
smallParam = 'left',
smallClass = 'mbox-small-left',
substCheck = true,
classes = {'metadata', 'ambox'},
imageEmptyCell = true,
imageCheckBlank = true,
imageSmallSize = '20x20px',
imageCellDiv = true,
useCollapsibleTextFields = true,
imageRightNone = true,
sectionDefault = 'article',
allowMainspaceCategories = true,
templateCategory = 'Article message templates',
templateCategoryRequireName = true,
templateErrorCategory = 'Article message templates with missing parameters',
templateErrorParamsToCheck = {'issue', 'fix', 'subst'},
removalNotice = '<small>[[Help:Maintenance template removal|Learn how and when to remove this template message]]</small>',
templatestyles = 'Module:Message box/ambox.css'
},
cmbox = {
types = {
speedy = {
class = 'cmbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'cmbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'cmbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'cmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'cmbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'cmbox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'cmbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'cmbox'},
imageEmptyCell = true,
templatestyles = 'Module:Message box/cmbox.css'
},
fmbox = {
types = {
warning = {
class = 'fmbox-warning',
image = 'Ambox warning pn.svg'
},
editnotice = {
class = 'fmbox-editnotice',
image = 'Information icon4.svg'
},
system = {
class = 'fmbox-system',
image = 'Information icon4.svg'
}
},
default = 'system',
showInvalidTypeError = true,
classes = {'fmbox'},
imageEmptyCell = false,
imageRightNone = false,
templatestyles = 'Module:Message box/fmbox.css'
},
imbox = {
types = {
speedy = {
class = 'imbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'imbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'imbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'imbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'imbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'imbox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
license = {
class = 'imbox-license licensetpl',
image = 'Imbox-license.svg'
},
["license-related"] = {
class = 'imbox-license',
image = 'Imbox-license.svg'
},
featured = {
class = 'imbox-featured',
image = 'Cscr-featured.svg',
imageNeedsLink = true
},
notice = {
class = 'imbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'imbox'},
imageEmptyCell = true,
below = true,
templateCategory = 'File message boxes',
templatestyles = 'Module:Message box/imbox.css'
},
ombox = {
types = {
speedy = {
class = 'ombox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'ombox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'ombox-content',
image = 'Ambox important.svg'
},
style = {
class = 'ombox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ombox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'ombox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'ombox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'ombox'},
allowSmall = true,
imageEmptyCell = true,
imageRightNone = true,
templatestyles = 'Module:Message box/ombox.css'
},
tmbox = {
types = {
speedy = {
class = 'tmbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'tmbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'tmbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'tmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'tmbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'tmbox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'tmbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'tmbox'},
allowSmall = true,
imageRightNone = true,
imageEmptyCell = true,
templateCategory = 'Talk message boxes',
templatestyles = 'Module:Message box/tmbox.css'
}
}
ccb6bdf2868087b6833d203307f2f6a92b3b0a01
Template:Template parameter usage
10
137
233
2023-11-27T06:57:32Z
wikipedia>Sdkb
0
Partial revert of [[User:SUM1]]'s edit [[Special:Diff/1039918972]] per [[WP:CLICKHERE]]
wikitext
text/x-wiki
{{#switch:{{{label|}}}
|=[https://bambots.brucemyers.com/TemplateParam.php?wiki=enwiki&template={{Urlencode:{{#if:{{{1|}}}|{{ROOTPAGENAME:{{{1|}}}}}|{{ROOTPAGENAME}}}}}} {{#ifeq:{{yesno-no|{{{lc}}}}}|no|S|s}}ee a monthly parameter usage report] for {{#if:{{{1|}}}|[[Template:{{ROOTPAGENAME:{{{1|}}}}}]]|this template}} in articles{{#ifeq:{{yesno-no|{{{based}}}}}|yes| based on {{#if:{{{1|}}}|its|this}} TemplateData}}.
|None|none=[https://bambots.brucemyers.com/TemplateParam.php?wiki=enwiki&template={{Urlencode:{{#if:{{{1|}}}|{{ROOTPAGENAME:{{{1|}}}}}|{{ROOTPAGENAME}}}}}} {{#ifeq:{{yesno-no|{{{lc}}}}}|no|P|p}}arameter usage report]{{#ifeq:{{yesno-no|{{{based}}}}}|yes| based on {{#if:{{{1|}}}|its|this}} TemplateData}}
|for|For=[https://bambots.brucemyers.com/TemplateParam.php?wiki=enwiki&template={{Urlencode:{{#if:{{{1|}}}|{{ROOTPAGENAME:{{{1|}}}}}|{{ROOTPAGENAME}}}}}} {{#ifeq:{{yesno-no|{{{lc}}}}}|no|P|p}}arameter usage report] for {{#if:{{{1|}}}|[[Template:{{ROOTPAGENAME:{{{1|}}}}}]]|[[Template:{{ROOTPAGENAME}}]]}}{{#ifeq:{{yesno-no|{{{based}}}}}|yes| based on {{#if:{{{1|}}}|its|this}} TemplateData}}.
|#default=[https://bambots.brucemyers.com/TemplateParam.php?wiki=enwiki&template={{Urlencode:{{#if:{{{1|}}}|{{ROOTPAGENAME:{{{1|}}}}}|{{ROOTPAGENAME}}}}}} {{{label|}}}]{{#ifeq:{{yesno-no|{{{based}}}}}|yes| based on {{#if:{{{1|}}}|its|this}} TemplateData}}
}}<noinclude>
{{documentation}}
</noinclude>
83e574f5e031df639a2cdcef5b91d6b1094ae648
Template:TemplateData header
10
136
231
2023-12-01T11:27:04Z
wikipedia>Gonnym
0
fix website link if |1= is used
wikitext
text/x-wiki
<div class="templatedata-header">{{#if:{{{noheader|}}}|<!--
noheader:
-->{{Template parameter usage|{{{1|{{BASEPAGENAME}}}}}|based=y}}|<!--
+header:
-->This is the {{#if:{{{nolink|}}}|<!--
+header, nolink TD
-->TemplateData|<!--
+header, +link [[TD]]; DEFAULT:
-->[[Wikipedia:TemplateData|TemplateData]]}}<!--
e.o. #if:nolink; DEFAULT:
--> for this template used by [[mw:Extension:TemplateWizard|TemplateWizard]], [[Wikipedia:VisualEditor|VisualEditor]] and other tools. {{Template parameter usage|{{{1|{{BASEPAGENAME}}}}}|based=y}}<!--
e.o. #if:noheader
-->}}
'''TemplateData for {{{1|{{BASEPAGENAME}}}}}'''
</div><includeonly><!--
check parameters
-->{{#invoke:Check for unknown parameters|check
|unknown={{template other|1=[[Category:Pages using TemplateData header with unknown parameters|_VALUE_]]}}
|template=Template:TemplateData header
|1 |nolink |noheader
|preview=<div class="error" style="font-weight:normal">Unknown parameter '_VALUE_' in [[Template:TemplateData header]].</div>
}}<!--
-->{{template other|{{sandbox other||
[[Category:Templates using TemplateData]]
}}}}</includeonly><!--
--><noinclude>{{Documentation}}</noinclude>
748b89c815a11e78b365c5617460ea569f3f96cb
Template:Navbox/doc
10
145
249
2023-12-16T01:08:11Z
wikipedia>Dinoguy1000
0
/* Setup parameters */ add anchor for autocollapse linking
wikitext
text/x-wiki
{{for|vertically-aligned navigation|Template:Sidebar}}
{{documentation subpage}}
{{high use}}
{{Template display|nomobile}}
{{Lua|Module:Navbox}}
{{Navbox suite}}
{{Lua sidebar}}
This template allows a [[Wikipedia:Navigation template|navigational template]] to be set up relatively quickly by supplying it with one or more lists of links. It comes equipped with default styles that should work for most navigational templates. Changing the default styles is possible, but not recommended. Using this template, or one of its "Navbox suite" sister templates, is highly recommended for standardization of navigational templates, and for ease of use.
{{Navbox visibility}}
== Usage ==
Please remove the parameters that are left blank.
<syntaxhighlight lang="wikitext" style="overflow: auto;">{{Navbox
| name = {{subst:PAGENAME}}{{subst:void|Don't change anything on this line. It will change itself when you save.}}
| title =
| listclass = hlist
| state = {{{state|}}}
| above =
| image =
| group1 =
| list1 =
| group2 =
| list2 =
| group3 =
| list3 =
<!-- ... -->
| below =
}}
</syntaxhighlight>
== Parameter list ==
{{{{PAGENAMETDOC}}
| name = Navbox/doc
| state = uncollapsed
| title = {{{title}}}
| above = {{{above}}}
| image = {{{image}}}
| group1 = {{{group1}}}
| list1 = {{{list1}}}
| group2 = {{{group2}}}
| list2 = {{{list2}}}
| group3 = {{{group3}}}
| list3 = {{{list3}}}
| group4 = {{{group4}}}
| list4 = {{{list4}}}
| below = {{{below}}} <br /> See alternate navbox formats under: [[#Layout of table|''Layout of table'']]
}}
The navbox uses lowercase parameter names, as shown in the box (''above''). The required ''name'' and ''title'' will create a one-line box if other parameters are omitted.
Notice "group1" (etc.) is optional, as are sections named "above/below".
{{clear}}
The basic and most common parameters are as follows (see [[#Parameter descriptions|below]] for the full list):
: <code>name</code> – the name (Wikipedia location) of the template.
: <code>title</code> – text in the title bar, such as: <nowiki>[[Widget stuff]]</nowiki>.
: <code>listclass</code> – a CSS class for the list cells, usually <code>hlist</code> for horizontal lists. Alternatively, use bodyclass for the whole box.
: <code>state</code> – controls when a navbox is expanded or collapsed.
: <code>titlestyle</code> – a CSS style for the title-bar, such as: <code>background: gray;</code>
: <code>groupstyle</code> – a CSS style for the group-cells, such as: <code>background: #eee;</code>
: <code>above</code> – text to appear above the group/list section (could be a list of overall wikilinks).
: <code>image</code> – an optional right-side image, coded as the whole image, such as: <code><nowiki>[[File:</nowiki><var>XX</var><nowiki>.jpg|80px|link=|alt=]]</nowiki></code>
:: Note that most of such images don't comply with [[MOS:DECOR]] and should be removed at sight.
: <code>imageleft</code> – an optional left-side image (code the same as the "image" parameter).
: <code>group<sub>n</sub></code> – the left-side text before list-n (if group-n omitted, list-n extends to the left edge of the box, and defaults to <code>text-align:center</code> styling).
: <code>list<sub>n</sub></code> – text listing wikilinks using a [[Help:List|wikilist]] format.
: <code>below</code> – optional text to appear below the group/list section.
== Parameter descriptions ==
The following is a complete list of parameters for using {{tl|Navbox}}. In most cases, the only required parameters are <code>name</code>, <code>title</code>, and <code>list1</code>, though [[Template:Navbox/doc#Child navboxes|child navboxes]] do not even require those to be set.
{{tl|Navbox}} shares numerous common parameter names with its sister templates, {{tl|Navbox with columns}} and {{tl|Navbox with collapsible groups}}, for consistency and ease of use. Parameters marked with an asterisk (*) are common to all three master templates.
=== Setup parameters ===
; ''name''*
: The name of the template, which is needed for the "V • T • E" ("View • Talk • Edit") links to work properly on all pages where the template is used. You can enter <code><nowiki>{{subst:PAGENAME}}</nowiki></code> for this value as a shortcut. The name parameter is only mandatory if a <code>title</code> is specified, and the <code>border</code> parameter is not set, and the <code>navbar</code> parameter is not used to disable the navbar.
; ''state''* <span style="font-weight:normal;">[<code>autocollapse, collapsed, expanded, plain, off</code>]</span>{{anchor|Autocollapse}}
:* Defaults to <code>autocollapse</code>. A navbox with <code>autocollapse</code> will start out collapsed if there are two or more collapsible elements on the same page. Otherwise, the navbox will be expanded. For the technically minded, see [[MediaWiki:Common.js]] (search for "autocollapse").
:* If set to <code>collapsed</code>, the navbox will always start out in a collapsed state.
:* If set to <code>expanded</code>, the navbox will always start out in an expanded state.
:* If set to <code>plain</code>, the navbox will always be expanded with no [hide] link on the right, and the title will remain centered (by using padding to offset the <small>V • T • E</small> links).
:* If set to <code>off</code>, the navbox will always be expanded with no [hide] link on the right, but no padding will be used to keep the title centered. This is for advanced use only; the "plain" option should suffice for most applications where the [show]/[hide] button needs to be hidden.
: To show the box when standalone (non-included) but then auto-hide contents when in an article, put "expanded" inside {{tag|noinclude|p}} tags. This setting will force the box to be visible when standalone (even when followed by other boxes), displaying "[hide]", but then it will auto-collapse the box when stacked inside an article:
:: <code><nowiki>| state = </nowiki></code>{{tag|noinclude|content=expanded}}
:Often times, editors will want a default initial state for a navbox, which may be overridden in an article. Here is the trick to do this:
:* In your intermediate template, create a parameter also named "state" as a pass-through like this: <pre><nowiki>| state = {{{state<includeonly>|your_desired_initial_state</includeonly>}}}</nowiki></pre>
:* The {{tag|includeonly|o}}<code>|</code> will make the template expanded when viewing the template page by itself.
:** Example 1: {{tl|Peso}} with ''autocollapse'' as the default initial state. [[Catalan peseta]] transcludes it and has only one navbox; thus, the peso navbox shows. [[Chilean peso]] has more than two navboxes; thus, the peso navbox collapses.
:** Example 2: {{tl|Historical currencies of Hungary}} with ''expanded'' as the default initial state, as such: <pre>| state = {{{state<includeonly>|expanded</includeonly>}}}</pre> All transcluding articles show the content by default, unless there is a hypothetical article that specifies <code><nowiki>{{templatename|state=collapsed}}</nowiki></code> when transcluding.
:** Example 3: {{tl|Tourism}} with ''collapsed'' as the default initial state, as such: <pre>| state = {{{state<includeonly>|collapsed</includeonly>}}}</pre> All transcluding articles will show the template as collapsed by default, but the template will still be uncollapsed when displayed on its own page.
:* The template {{tl|Collapsible option}} explains how to use the <code>state</code> parameter. It can be added to a {{tag|noinclude|p}} section after the template definition or to the instructions on the {{tl|documentation subpage}}.
; ''navbar''*
: If set to <code>plain</code>, the <span style="font-size: 88%;">V • T • E</span> links on the left side of the titlebar will not be displayed, and padding will be automatically used to keep the title centered. Use <code>off</code> to remove the <span style="font-size: 88%;">V • T • E</span> links, but not apply padding (this is for advanced use only; the "plain" option should suffice for most applications where a navbar is not desired). It is highly recommended that one not hide the navbar, in order to make it easier for users to edit the template, and to keep a standard style across pages.
; ''border''*
: ''See later section on [[#Child navboxes|using navboxes within one another]] for examples and a more complete description.'' If set to <code>child</code> or <code>subgroup</code>, then the navbox can be used as a borderless child that fits snugly in another navbox. The border is hidden and there is no padding on the sides of the table, so it fits into the ''list'' area of its parent navbox. If set to <code>none</code>, then the border is hidden and padding is removed, and the navbox may be used as a child of another container (do not use the <code>none</code> option inside of another navbox; similarly, only use the <code>child</code>/<code>subgroup</code> option inside of another navbox). If set to anything else (default), then a regular navbox is displayed with a 1px border. An alternate way to specify the border to be a subgroup style is like this (i.e. use the first unnamed parameter instead of the named ''border'' parameter):
:<pre>{{Navbox|child|...}}</pre>
=== Cells ===
; ''title''*
: Text that appears centered in the top row of the table. It is usually the template's topic, i.e. a succinct description of the body contents. This should be a single line, but if a second line is needed, use <code><nowiki>{{-}}</nowiki></code> to ensure proper centering. This parameter is technically not mandatory, but using {{tl|Navbox}} is rather pointless without a title.
; ''above''*
: A full-width cell displayed between the titlebar and first group/list, i.e. ''above'' the template's body (groups, lists and image). In a template without an image, ''above'' behaves in the same way as the ''list1'' parameter without the ''group1'' parameter.
; ''group<sub>n</sub>''*
: (i.e. ''group1'', ''group2'', etc.) If specified, text appears in a header cell displayed to the left of ''list<sub>n</sub>''. If omitted, ''list<sub>n</sub>'' uses the full width of the table.
; ''list<sub>n</sub>''*
: (i.e. ''list1'', ''list2'', etc.) The body of the template, usually a list of links. Format is inline, although the text can be entered on separate lines if the entire list is enclosed within <code><nowiki><div> </div></nowiki></code>. At least one ''list'' parameter is required; each additional ''list'' is displayed in a separate row of the table. Each ''list<sub>n</sub>'' may be preceded by a corresponding ''group<sub>n</sub>'' parameter, if provided (see below).
:Entries should be separated using a [[newline]] and an [[asterisk]] (*). If instead two asterisks are used, it provides [[Nesting (computing)|nesting]] within the previous entry by enclosing the entry with brackets. Increasing the number of asterisks used increases the number of brackets around entries.
; ''image''*
: An image to be displayed in a cell below the title and to the right of the body (the groups/lists). For the image to display properly, the ''list1'' parameter must be specified. The ''image'' parameter accepts standard wikicode for displaying an image, ''e.g.'': <pre>[[File:</nowiki><var>XX</var><nowiki>.jpg|80px|link=|alt=]]</pre> nb: including "|right" will produce the usual left margin to provide separation from the list items and [[Zebra striping (computer graphics)|zebra striping]].
:Note that most of such images don't comply with [[MOS:DECOR]] and should be removed at sight. A rare example of a correct usage would be [[special:permalink/995622594|this one]]: a map shows (in green) the location of a region within the state of Kazakhstan, and this is consistently implemented for [[:category:Kazakhstan region templates|all state's regions]].
; ''imageleft''*
: An image to be displayed in a cell below the title and to the left of the body (lists). For the image to display properly, the ''list1'' parameter must be specified and no groups can be specified. It accepts the same sort of parameter that ''image'' accepts.
; ''below''*
: A full-width cell displayed ''below'' the template's body (groups, lists and image). In a template without an image, ''below'' behaves in the same way as the template's final ''list<sub>n</sub>'' parameter without a ''group<sub>n</sub>'' parameter. For an example of the ''below'' parameter in use, see {{oldid|Main Page|352612160|this}} version of {{tl|Lists of the provinces and territories of Canada}}. {{tl|icon}} is often used for non-article links, for example <code><nowiki>{{icon|category}} [[:Category:</nowiki>''name''<nowiki>|Category]]</nowiki></code>.
=== Style parameters ===
Styles are generally advised against, to maintain consistency among templates and pages in Wikipedia; but the option to modify styles is given.
; ''bodystyle''*
: Specifies [[Cascading Style Sheets|CSS]] styles to apply to the template body. This option should be used sparingly as it can lead to visual inconsistencies. Examples:
:* <code>bodystyle = background: #''nnnnnn'';</code>
:* <code>bodystyle = width: ''N'' [em/%/px or width: auto];</code>
:* <code>bodystyle = float: [''left/right/none''];</code>
:* <code>bodystyle = clear: [''right/left/both/none''];</code>
; ''basestyle''*
: CSS styles to apply to the ''title'', ''above'', ''below'', and ''group'' cells all at once. The styles are not applied to ''list'' cells. This is convenient for easily changing the basic color of the navbox without having to repeat the style specifications for the different parts of the navbox. Example: <code>basestyle = background: lightskyblue;</code>
; ''titlestyle''*
: [[Cascading Style Sheets|CSS]] styles to apply to ''title'', most often the titlebar's background color:
:* <code>titlestyle = background: ''#nnnnnn'';</code>
:* <code>titlestyle = background: ''name'';</code>
:* <code>titlestyle = background: none;</code> — for no background color
; ''groupstyle''*
: CSS styles to apply to the ''groupN'' cells. This option overrides any styles that are applied to the entire table. Examples:
:* <code>groupstyle = background: #''nnnnnn'';</code>
:* <code>groupstyle = text-align: [''left/center/right''];</code>
:* <code>groupstyle = vertical-align: [''top/middle/bottom''];</code>
; ''group<sub>n</sub>style''*
: CSS styles to apply to a specific group, in addition to any styles specified by the ''groupstyle'' parameter. This parameter should only be used when absolutely necessary in order to maintain standardization and simplicity. Example: <code>group3style = background: red; color: white;</code>
; ''groupwidth''
: A number and unit specifying a uniform width for the group cells, in cases where little content in the list cells may cause group cells to be too wide. No default. However, may be overridden by the ''group(n)style'' parameter. Example: <code>groupwidth = 9em</code>
; ''liststyle''*
: CSS styles to apply to all lists. Overruled by the ''oddstyle'' and ''evenstyle'' parameters (if specified) hereafter. When using backgound colors in the navbox, see the [[#Intricacies|note hereafter]].
; ''list<sub>n</sub>style''*
: CSS styles to apply to a specific list, in addition to any styles specified by the ''liststyle'' parameter. This parameter should only be used when absolutely necessary in order to maintain standardization and simplicity. Example: <code>list5style = background: #ddddff;</code>
; ''listpadding''*
: A number and unit specifying the padding in each ''list'' cell. The ''list'' cells come equipped with a default padding of 0.25em on the left and right, and 0 on the top and bottom. Due to complex technical reasons, simply setting "liststyle = padding: 0.5em;" (or any other padding setting) will not work. Examples:
:* <code>listpadding = 0.5em 0;</code> (sets 0.5em padding for the top/bottom, and 0 padding for the left/right.)
:* <code>listpadding = 0;</code> (removes all list padding.)
; ''oddstyle''
; ''evenstyle''
: Applies to odd/even list numbers. Overrules styles defined by ''liststyle''. The default behavior is to add striped colors (white and gray) to odd/even rows, respectively, in order to improve readability. These should not be changed except in extraordinary circumstances.
; ''evenodd'' <span style="font-weight: normal;"><code>[swap, even, odd, off]</code></span>
: If set to <code>swap</code>, then the automatic striping of even and odd rows is reversed. Normally, even rows get a light gray background for striping; when this parameter is used, the odd rows receive the gray striping instead of the even rows. Setting to <code>even</code> or <code>odd</code> sets all rows to have that striping color. Setting to <code>off</code> disables automatic row striping.
; ''abovestyle''*
; ''belowstyle''*
: CSS styles to apply to the top cell (specified via the ''above'' parameter) and bottom cell (specified via the ''below'' parameter). Typically used to set background color or text alignment:
:* <code>abovestyle = background: #''nnnnnn'';</code>
:* <code>abovestyle = text-align: [''left/center/right''];</code>
:* <code>belowstyle = background: #''nnnnnn'';</code>
:* <code>belowstyle = text-align: [''left/center/right''];</code>
; ''imagestyle''*
; ''imageleftstyle''*
: CSS styles to apply to the cells where the image/imageleft sits. These styles should only be used in exceptional circumstances, usually to fix width problems if the width of groups is set and the width of the image cell grows too large. Example: <code>imagestyle = width:5em;</code>
===== Default styles =====
The style settings listed here are those that editors using the navbox change most often. The other more complex style settings were left out of this list to keep it simple. Most styles are set in [[MediaWiki:Common.css]].
<syntaxhighlight lang="css">
bodystyle = background: #fdfdfd; width: 100%; vertical-align: middle;
titlestyle = background: #ccccff; padding-left: 1em; padding-right: 1em; text-align: center;
abovestyle = background: #ddddff; padding-left: 1em; padding-right: 1em; text-align: center;
belowstyle = background: #ddddff; padding-left: 1em; padding-right: 1em; text-align: center;
groupstyle = background: #ddddff; padding-left: 1em; padding-right: 1em; text-align: right;
liststyle = background: transparent; text-align: left/center;
oddstyle = background: transparent;
evenstyle = background: #f7f7f7;
</syntaxhighlight>
Since ''liststyle'' and ''oddstyle'' are transparent, odd lists have the color of the ''bodystyle'', which defaults to #fdfdfd (white with a hint of gray). A list defaults to <code>text-align: left;</code> if it has a group, if not it defaults to <code>text-align: center;</code>. Since only ''bodystyle'' has a vertical-align all the others inherit its <code>vertical-align: middle;</code>.
=== Advanced parameters ===
; ''bodyclass''
; ''aboveclass''
; ''groupclass''
; ''listclass''
; ''belowclass''
: This enables attaching a CSS class to group or list cells. The most common use for ''listclass'' is to give it the <code>hlist</code> class that will cause lists to render horizontally. All these parameters accept the <code>hlist</code> class, but if more than one parameter is used for <code>hlist</code>, use {{para|bodyclass|hlist}} instead.
:{{tl|navbox}} automatically adds the class <code>nowraplinks</code> which can be overridden, for example with <code>{{para|listclass|wraplinks}}</code>.
; ''innerstyle''
: A very advanced parameter to be used ''only'' for advanced meta-templates employing the navbox. Internally, the navbox uses an outer table to draw the border, and then an inner table for everything else (title/above/groups/lists/below/images, etc.). The ''style''/''bodystyle'' parameter sets the style for the outer table, which the inner table inherits, but in advanced cases (meta-templates) it may be necessary to directly set the style for the inner table. This parameter provides access to that inner table so styles can be applied. Use at your own risk.
; ''nowrapitems''
: Setting <code>|nowrapitems=yes</code> applies nowrap to each line in a list item, and to any <code>above</code> or <code>below</code> item.
; ''orphan''
: Setting <code>|orphan=yes</code> in a child navbox fixes odd/even striping and removes [[:Category:Navbox orphans]].
==== Microformats ====
; ''bodyclass''
: This parameter is inserted into the "class" attribute for the navbox as a whole.
; ''titleclass''
: This parameter is inserted into the "class" attribute for the navbox's title caption.
This template supports the addition of microformat information. This is done by adding "class" attributes to various data cells, indicating what kind of information is contained within. To flag a navbox as containing [[hCard]] information about a person, for example, add the following parameter:
<pre>
| bodyclass = vcard
</pre>
''and''
<pre>
| titleclass = fn
</pre>
''or'' (for example):
<pre><nowiki>
| title = The books of <span class="fn">[[Iain Banks]]</span>
</nowiki></pre>
...and so forth.
See [[Wikipedia:WikiProject Microformats]] for more information on adding microformat information to Wikipedia, and [[microformat]] for more information on microformats in general.
== Layout of table ==
===Without image, above and below===
Table generated by {{tl|Navbox}} '''without''' ''image'', ''above'' and ''below'' parameters (gray list background color added for illustration only):
{{{{PAGENAMETDOC}}
| name = Navbox/doc
| state = uncollapsed
| liststyle = background: silver;
| title = {{{title}}}
| group1 = {{{group1}}}
| list1 = {{{list1}}}
| group2 = {{{group2}}}
| list2 = {{{list2}}}
| list3 = {{{list3}}} ''without {{{group3}}}''
| group4 = {{{group4}}}
| list4 = {{{list4}}}
}}
===With image, above and below===
Table generated by {{tl|Navbox}} '''with''' ''image'', ''above'' and ''below'' parameters (gray list background color added for illustration only):
{{{{PAGENAMETDOC}}
| name = Navbox/doc
| state = uncollapsed
| liststyle = background: silver;
| image = {{{image}}}
| title = {{{title}}}
| above = {{{above}}}
| group1 = {{{group1}}}
| list1 = {{{list1}}}
| group2 = {{{group2}}}
| list2 = {{{list2}}}
| list3 = {{{list3}}} ''without {{{group3}}}''
| group4 = {{{group4}}}
| list4 = {{{list4}}}
| below = {{{below}}}
}}
===With image and without groups===
Table generated by {{tl|Navbox}} '''with''' ''image'', ''imageleft'', ''lists'', and '''without''' ''groups'', ''above'', ''below'' (gray list background color added for illustration only):
{{{{PAGENAMETDOC}}
| name = Navbox/doc
| state = uncollapsed
| liststyle = background: silver;
| image = {{{image}}}
| imageleft = {{{imageleft}}}
| title = {{{title}}}
| list1 = {{{list1}}}
| list2 = {{{list2}}}
| list3 = {{{list3}}}
| list4 = {{{list4}}}
}}
== Examples ==
<!-- Please do not encourage folks to use <div> within Navboxes as (unless handled carefully) they can negate liststyles/groupstyles/etc. settings. -->
=== No image ===
<syntaxhighlight lang="wikitext" style="overflow: auto;">
{{Navbox
| name = Navbox/doc
| title = [[MSC Malaysia]]
| listclass = hlist
| group1 = Centre
| list1 =
* [[Cyberjaya]]
| group2 = Area
| list2 =
* [[Klang Valley]]
| group3 = Major landmarks
| list3 =
* [[Petronas Twin Towers]]
* [[Kuala Lumpur Tower]]
* [[Kuala Lumpur Sentral]]
* [[Technology Park Malaysia]]
* [[Putrajaya]]
* [[Cyberjaya]]
* [[Kuala Lumpur International Airport]]
| group4 = Infrastructure
| list4 =
* [[Express Rail Link]]
* [[KL-KLIA Dedicated Expressway]]
| group5 = Prime applications
| list5 =
* [[E-Government]]
* [[MyKad]]
}}
</syntaxhighlight>
{{{{PAGENAMETDOC}}
| name = Navbox/doc
| state = uncollapsed
| title = [[MSC Malaysia]]
| listclass = hlist
| group1 = Centre
| list1 =
* [[Cyberjaya]]
| group2 = Area
| list2 =
* [[Klang Valley]]
| group3 = Major landmarks
| list3 =
* [[Petronas Twin Towers]]
* [[Kuala Lumpur Tower]]
* [[Kuala Lumpur Sentral]]
* [[Technology Park Malaysia]]
* [[Putrajaya]]
* [[Cyberjaya]]
* [[Kuala Lumpur International Airport]]
| group4 = Infrastructure
| list4 =
* [[Express Rail Link]]
* [[KL-KLIA Dedicated Expressway]]
| group5 = Prime applications
| list5 =
* [[E-Government]]
* [[MyKad]]
}}
== Child navboxes ==
{{Selfref|For additional examples, see the [[Template:Navbox/testcases|Navbox testcases page]].}}
It is possible to place multiple navboxes within a single border by using "child" as the first parameter, or by setting the ''border'' parameter. The basic code for doing this is as follows (which adds a subgroup for the first group/list area):
<pre style="overflow: auto;">
{{Navbox
| name = {{subst:PAGENAME}}
| title = Title
| group1 = [optional]
| list1 = {{Navbox|child
...child navbox parameters...
}}
...
}}
</pre>
=== Subgroups example ===
This example shows two subgroups created using <code>child</code> as the first unnamed parameter. The striping is alternated automatically. To remove the striping altogether, you can set <code>liststyle = background:transparent;</code> in each of the navboxes.
{{{{PAGENAMETDOC}}
| name = Navbox/doc
| state = uncollapsed
| title = Multiple subgroup example
| above = Above
| below = Below
| group1 = Group1
| list1 = List1
| group2 = Group2
| list2 =
{{{{PAGENAMETDOC}}|child
| group1 = Group2.1
| list1 = List1
| group2 = Group2.2
| list2 = List2
| group3 = Group2.3
| list3 = List3
}}
| group3 = Group3
| list3 = List3
| group4 = Group4
| list4 =
{{{{PAGENAMETDOC}}|child
| group1 = Group4.1
| list1 = List1
| group2 = Group4.2
| list2 = List2
| group3 = Group4.3
| list3 = List3
}}
}}
=== Multiple show/hides in a single container ===
{{main|Template:Navbox with collapsible groups}}
The example below is generated using a regular navbox for the main container, then its list1, list2, and list3 parameters each contain another navbox, with <code>1 = child</code> set. The view (v), talk (t), edit (e) navbar links are hidden using <code>navbar = plain</code> for each of them, or could be suppressed by just leaving out the ''name'' parameter (child navboxes do not require the name parameter to be set, unlike regular navboxes).
{{{{PAGENAMETDOC}}
| name = Navbox/doc
| title = [[French colonial empire|Former French overseas empire]]
| state = uncollapsed
| list1 = {{{{PAGENAMETDOC}}|child
| navbar = plain
| title = [[French colonial empire|Former French colonies]] in [[Africa]] and the [[Indian Ocean]]
| listclass = hlist
| group1 = [[Mahgreb]]
| list1 =
* [[French rule in Algeria|Algeria]]
* [[French Morocco|Morocco]] <small>([[Arguin|Arguin Island]])</small>
* [[History of Tunisia|Tunisia]]
| group2 = [[French West Africa]]
| list2 =
* [[History of Côte d'Ivoire#French Period|Côte d'Ivoire]]
* [[French Dahomey|Dahomey]]
* [[French Sudan]]
* [[French Guinea|Guinea]]
* [[History of Mauritania#French colonization and post-colonial history|Mauritania]]
* [[History of Niger#Colonization|Niger]]
* [[History of Senegal|Senegal]]
* [[French Upper Volta|Upper Volta]]
* [[French Togoland]]
* [[James Island (The Gambia)|James Island]]
| group3 = [[French Equatorial Africa]]
| list3 =
* [[Colonial Chad|Chad]]
* [[History of Gabon|Gabon]]
* [[History of the Republic of the Congo|Middle Congo]]
* [[Oubangui-Chari]]
| group4 = [[Comoros]]
| list4 =
* [[Anjouan]]
* [[Grande Comore]]
* [[Mohéli]]
* [[History of Djibouti#French Interest|French Somaliland (Djibouti)]]
* [[History of Madagascar#French control|Madagascar]]
* [[Mauritius|Ile de France]]
* [[Seychelles]]
}}
| list2 = {{{{PAGENAMETDOC}}|child
| navbar = plain
| title = [[French colonial empire|Former French colonies]] in the [[Americas]]
| listclass = hlist
| list1 =
* [[New France]]{{spaces|2}}<small>([[Acadia]], [[Louisiana (New France)|Louisiana]], [[Canada, New France|Canada]], [[Newfoundland (island)|Terre Neuve]]) 1655–1763 </small>
| list2 =
* [[Inini]]
* [[Berbice]]
* [[Saint-Domingue]]
* <small>[[Haiti]]</small>
* [[Tobago]]
* [[History of the British Virgin Islands|Virgin Islands]]
* [[France Antarctique]]
* [[France Équinoxiale]]
| below = [[French West India Company]]
}}
| list3 = {{{{PAGENAMETDOC}}|child
| navbar = plain
| title = [[French colonial empire|Former French colonies]] in [[Asia]] and [[Oceania]]
| listclass = hlist
| group1 = [[French India]]
| list1 =
* [[Chandernagor]]
* [[Coromandel Coast]]
* [[History of Chennai|Madras]]
* [[Mahé, India|Mahé]]
* [[History of Pondicherry|Pondichéry]]
* [[Karaikal]]
* [[Yanam (India)|Yanaon]]
| group2 = [[French Indochina]]
| list2 =
* [[Colonial Cambodia|Cambodia]]
* [[History of Laos to 1945#French Laos|Laos]]
* [[French Indochina|Vietnam]] <small>([[Annam (French colony)|Annam]], [[Cochinchina]], [[Tonkin]])</small>
| group3 = Other Asian
| list3 =
* [[Alawite State|Alaouites]]
* [[Republic of Hatay|Alexandretta-Hatay]]
* [[Sri Lanka|Ceylon]]
* [[Kwangchowan]]
| group4 = [[Oceania]]
| list4 =
* [[New Hebrides]]
** [[History of Vanuatu|Vanuatu]]
| below = [[French East India Company]]
}}
}}
== Relationship with other Navbox templates ==
This navbox template works in conjunction with two other templates: {{tl|Navbox with columns}} and {{tl|Navbox with collapsible groups}}. All three of these templates share common parameters for consistency and ease of use (such parameters are marked with an asterisk (*) in the [[#Parameter descriptions|parameter descriptions]] list hereinbefore). Most importantly, each template can be used as a child of one another (by using the {{para|border|child}} parameter, or by specifying the first unnamed parameter to be <code>child</code>. For example: <code><nowiki>{{Navbox|child ...}}</nowiki></code>, <code><nowiki>{{Navbox with columns|child ...}}</nowiki></code> or <code><nowiki>{{Navbox with collapsible groups|child ...}}</nowiki></code>.)
== Technical details ==
* The {{navbar|1=:{{FULLPAGENAME}}|mini=on}} links are produced by [[Template:Navbar]]. If you have a question about them, it is probably best to ask at [[Template talk:Navbar]].
* The 2px wide border between groups and lists is drawn using the border-left property of the list cell. Thus, if you wish to change the background color of the template (for example <code>bodystyle = background:purple;</code>), then you'll need to make the border-left-color match the background color (i.e. <code>liststyle = border-left-color: purple;</code>). If you wish to have a border around each list cell, then the 2px border between the list cells and group cells will disappear; you'll have to come up with your own solution.
* Adjacent navboxes have only a 1 pixel border between them. If you set the top or bottom margin of <code>style/bodystyle</code>, then this will not work.
* The default margin-left and margin-right of the outer navbox table are set to "auto;". If you wish to use navbox as a float, you need to manually set the margin-left and margin-right values, because the auto margins interfere with the float option. For example, add the following code to use the navbox as a float:
** <code>bodystyle = width: 22em; float: right; margin-left: 1em; margin-right: 0;</code>
=== Copying to other projects or wikis ===
If you are trying to copy {{tlf|Navbox}} to your local wiki, there are several other things that must be installed or copied over as well:
* The [[mw:Extension:Scribunto|Scribunto]] and [[:mw:Extension:TemplateStyles|TemplateStyles]] extensions must be installed.
* [[Module:Navbox]] and its module and TemplateStyles dependencies, listed in the above two links
* Optionally, the <code>Add support to mw-collapsible for autocollapse, innercollapse and outercollapse</code> script from [[MediaWiki:Common.js]] may be copied, if autocollapsing is desired.
== TemplateData ==
{{TemplateDataHeader}}
<templatedata>
{
"params": {
"state": {
"label": "State",
"description": "Controls when a navbox is expanded or collapsed",
"example": "autocollapse",
"suggestedvalues": [
"autocollapse",
"collapsed",
"expanded",
"plain",
"off"
],
"default": "autocollapse",
"suggested": true
},
"title": {
"label": "Title",
"description": "Text in the title bar; centered in the top row of the table. Usually the template's topic.",
"example": "[[Widget stuff]]",
"suggested": true
},
"above": {
"label": "Above",
"description": "Full-width cell displayed between the titlebar and first group/list, i.e. above the template's body (groups, lists and image)",
"type": "string",
"suggested": true
},
"image": {
"label": "Image",
"description": "Image to be displayed in a cell below the title and to the right of the body",
"example": "[[File:XX.jpg | 80px | link= | alt= ]]",
"type": "wiki-file-name",
"suggested": true
},
"group1": {
"label": "Group 1",
"description": "If specified, text appears in a header cell displayed to the left of list 1. If omitted, list 1 uses the full width of the table.",
"suggested": true
},
"list1": {
"label": "List 1",
"description": "Body of the template; usually a list of links. Format is inline. At least one list parameter is required; each additional list is displayed in a separate row of the table. Each listn may be preceded by a corresponding groupn parameter.\nEntries should be separated using a newline and an asterisk. If two asterisks are used, it provides nesting within the previous entry with brackets.",
"required": true,
"suggested": true
},
"group2": {
"suggested": true
},
"list2": {
"suggested": true
},
"list3": {
"suggested": true
},
"group3": {
"suggested": true
},
"group4": {},
"list4": {},
"below": {
"label": "Below",
"description": "Full-width cell displayed below the template's body.",
"suggested": true
},
"imageleft": {
"label": "Image left",
"description": "Image to be displayed in a cell below the title and to the left of the body. For the image to display properly, list1 parameter must be specified and no groups can be specified.",
"example": "[[File:XX.jpg | 80px | link= | alt= ]]",
"type": "wiki-file-name"
},
"name": {
"label": "Name",
"description": "The name of the template. Needed for \"View • Talk • Edit\" links to work properly.",
"type": "string",
"default": "{{subst:PAGENAME}}{{subst:void|Don't change anything on this line. It will change itself when you save.}}",
"suggested": true
},
"listclass": {
"label": "List class",
"description": "CSS class for the list cells, usually hlist for horizontal lists. Alternatively, use bodyclass for the whole box.",
"example": "hlist",
"type": "string"
},
"navbar": {
"label": "Navbar status",
"example": "plain, off",
"type": "string"
},
"border": {
"label": "Border status",
"example": "child, subgroup, none",
"type": "string"
},
"bodystyle": {},
"basestyle": {},
"titlestyle": {},
"groupstyle": {},
"group1style": {},
"groupwidth": {},
"liststyle": {},
"list1style": {},
"listpadding": {},
"oddstyle": {},
"evenstyle": {},
"evenodd": {
"suggestedvalues": [
"swap",
"even",
"odd",
"off"
]
},
"abovestyle": {},
"belowstyle": {},
"imagestyle": {},
"imageleftstyle": {}
},
"description": "Creates a navigational box for links to other pages. \nDoes not display in mobile.",
"paramOrder": [
"name",
"title",
"group1",
"list1",
"listclass",
"state",
"above",
"below",
"image",
"group2",
"list2",
"group3",
"list3",
"group4",
"list4",
"imageleft",
"navbar",
"border",
"bodystyle",
"basestyle",
"titlestyle",
"groupstyle",
"liststyle",
"group1style",
"list1style",
"groupwidth",
"listpadding",
"oddstyle",
"evenstyle",
"evenodd",
"abovestyle",
"belowstyle",
"imagestyle",
"imageleftstyle"
]
}
</templatedata>
== See also ==
* {{tl|Navboxes}} — groups several navigation boxes together.
* {{tl|Nobold}} — To display text at normal font-weight within a context where the default font-weight is bold, e.g. header cells in tables.
* {{tl|Sidebar}} — Vertically-aligned navigation templates.
* {{tl|Navbox documentation}} — Shows the standard documentation using {{tl|Documentation}}.
* [[Template:Navbox/testcases]] — For additional examples of template code.
* [[Wikipedia:Line-break handling]] — The how-to guide about how to handle word wraps (line breaks) on Wikipedia, such as the wrapping of the link lists used in navboxes.
* [[Wikipedia:Template documentation]] — Guideline to creating the accompanying documentation
* {{tl|Nowrap begin}}, {{tl|·}} and {{tl|•}} are '''deprecated''' in favor of the <code>hlist</code> class for formatting lists. See [[Template:Flatlist#Technical details|Flatlist]] for a technical explanation of how <code>hlist</code> works.
=== Tracking categories ===
* {{clc|Navbox orphans}}
* {{clc|Navigational boxes without horizontal lists}}
* {{clc|Navboxes using background colours}}
* {{clc|Potentially illegible navboxes}}
* {{clc|Navboxes using borders}}
{{Navigation templates}}
<includeonly>{{sandbox other||
<!-- Add categories below this line, and interwikis at Wikidata -->
[[Category:Navbox meta-templates| ]]
[[Category:Templates generating microformats]]
[[Category:Templates that are not mobile friendly]]
[[Category:Collapse templates]]
}}</includeonly>
d066d126011321a46760c550d71ae2a7a76c9fe3
Module:Documentation
828
73
105
2024-01-07T08:09:04Z
wikipedia>DannyS712
0
remove unneeded return variables (if this breaks anything feel free to revert without discussing with me first)
Scribunto
text/plain
-- This module implements {{documentation}}.
-- Get required modules.
local getArgs = require('Module:Arguments').getArgs
-- Get the config table.
local cfg = mw.loadData('Module:Documentation/config')
local p = {}
-- Often-used functions.
local ugsub = mw.ustring.gsub
local format = mw.ustring.format
----------------------------------------------------------------------------
-- Helper functions
--
-- These are defined as local functions, but are made available in the p
-- table for testing purposes.
----------------------------------------------------------------------------
local function message(cfgKey, valArray, expectType)
--[[
-- Gets a message from the cfg table and formats it if appropriate.
-- The function raises an error if the value from the cfg table is not
-- of the type expectType. The default type for expectType is 'string'.
-- If the table valArray is present, strings such as $1, $2 etc. in the
-- message are substituted with values from the table keys [1], [2] etc.
-- For example, if the message "foo-message" had the value 'Foo $2 bar $1.',
-- message('foo-message', {'baz', 'qux'}) would return "Foo qux bar baz."
--]]
local msg = cfg[cfgKey]
expectType = expectType or 'string'
if type(msg) ~= expectType then
error('message: type error in message cfg.' .. cfgKey .. ' (' .. expectType .. ' expected, got ' .. type(msg) .. ')', 2)
end
if not valArray then
return msg
end
local function getMessageVal(match)
match = tonumber(match)
return valArray[match] or error('message: no value found for key $' .. match .. ' in message cfg.' .. cfgKey, 4)
end
return ugsub(msg, '$([1-9][0-9]*)', getMessageVal)
end
p.message = message
local function makeWikilink(page, display)
if display then
return format('[[%s|%s]]', page, display)
else
return format('[[%s]]', page)
end
end
p.makeWikilink = makeWikilink
local function makeCategoryLink(cat, sort)
local catns = mw.site.namespaces[14].name
return makeWikilink(catns .. ':' .. cat, sort)
end
p.makeCategoryLink = makeCategoryLink
local function makeUrlLink(url, display)
return format('[%s %s]', url, display)
end
p.makeUrlLink = makeUrlLink
local function makeToolbar(...)
local ret = {}
local lim = select('#', ...)
if lim < 1 then
return nil
end
for i = 1, lim do
ret[#ret + 1] = select(i, ...)
end
-- 'documentation-toolbar'
return format(
'<span class="%s">(%s)</span>',
message('toolbar-class'),
table.concat(ret, ' | ')
)
end
p.makeToolbar = makeToolbar
----------------------------------------------------------------------------
-- Argument processing
----------------------------------------------------------------------------
local function makeInvokeFunc(funcName)
return function (frame)
local args = getArgs(frame, {
valueFunc = function (key, value)
if type(value) == 'string' then
value = value:match('^%s*(.-)%s*$') -- Remove whitespace.
if key == 'heading' or value ~= '' then
return value
else
return nil
end
else
return value
end
end
})
return p[funcName](args)
end
end
----------------------------------------------------------------------------
-- Entry points
----------------------------------------------------------------------------
function p.nonexistent(frame)
if mw.title.getCurrentTitle().subpageText == 'testcases' then
return frame:expandTemplate{title = 'module test cases notice'}
else
return p.main(frame)
end
end
p.main = makeInvokeFunc('_main')
function p._main(args)
--[[
-- This function defines logic flow for the module.
-- @args - table of arguments passed by the user
--]]
local env = p.getEnvironment(args)
local root = mw.html.create()
root
:wikitext(p._getModuleWikitext(args, env))
:wikitext(p.protectionTemplate(env))
:wikitext(p.sandboxNotice(args, env))
:tag('div')
-- 'documentation-container'
:addClass(message('container'))
:attr('role', 'complementary')
:attr('aria-labelledby', args.heading ~= '' and 'documentation-heading' or nil)
:attr('aria-label', args.heading == '' and 'Documentation' or nil)
:newline()
:tag('div')
-- 'documentation'
:addClass(message('main-div-classes'))
:newline()
:wikitext(p._startBox(args, env))
:wikitext(p._content(args, env))
:tag('div')
-- 'documentation-clear'
:addClass(message('clear'))
:done()
:newline()
:done()
:wikitext(p._endBox(args, env))
:done()
:wikitext(p.addTrackingCategories(env))
-- 'Module:Documentation/styles.css'
return mw.getCurrentFrame():extensionTag (
'templatestyles', '', {src=cfg['templatestyles']
}) .. tostring(root)
end
----------------------------------------------------------------------------
-- Environment settings
----------------------------------------------------------------------------
function p.getEnvironment(args)
--[[
-- Returns a table with information about the environment, including title
-- objects and other namespace- or path-related data.
-- @args - table of arguments passed by the user
--
-- Title objects include:
-- env.title - the page we are making documentation for (usually the current title)
-- env.templateTitle - the template (or module, file, etc.)
-- env.docTitle - the /doc subpage.
-- env.sandboxTitle - the /sandbox subpage.
-- env.testcasesTitle - the /testcases subpage.
--
-- Data includes:
-- env.protectionLevels - the protection levels table of the title object.
-- env.subjectSpace - the number of the title's subject namespace.
-- env.docSpace - the number of the namespace the title puts its documentation in.
-- env.docpageBase - the text of the base page of the /doc, /sandbox and /testcases pages, with namespace.
-- env.compareUrl - URL of the Special:ComparePages page comparing the sandbox with the template.
--
-- All table lookups are passed through pcall so that errors are caught. If an error occurs, the value
-- returned will be nil.
--]]
local env, envFuncs = {}, {}
-- Set up the metatable. If triggered we call the corresponding function in the envFuncs table. The value
-- returned by that function is memoized in the env table so that we don't call any of the functions
-- more than once. (Nils won't be memoized.)
setmetatable(env, {
__index = function (t, key)
local envFunc = envFuncs[key]
if envFunc then
local success, val = pcall(envFunc)
if success then
env[key] = val -- Memoise the value.
return val
end
end
return nil
end
})
function envFuncs.title()
-- The title object for the current page, or a test page passed with args.page.
local title
local titleArg = args.page
if titleArg then
title = mw.title.new(titleArg)
else
title = mw.title.getCurrentTitle()
end
return title
end
function envFuncs.templateTitle()
--[[
-- The template (or module, etc.) title object.
-- Messages:
-- 'sandbox-subpage' --> 'sandbox'
-- 'testcases-subpage' --> 'testcases'
--]]
local subjectSpace = env.subjectSpace
local title = env.title
local subpage = title.subpageText
if subpage == message('sandbox-subpage') or subpage == message('testcases-subpage') then
return mw.title.makeTitle(subjectSpace, title.baseText)
else
return mw.title.makeTitle(subjectSpace, title.text)
end
end
function envFuncs.docTitle()
--[[
-- Title object of the /doc subpage.
-- Messages:
-- 'doc-subpage' --> 'doc'
--]]
local title = env.title
local docname = args[1] -- User-specified doc page.
local docpage
if docname then
docpage = docname
else
docpage = env.docpageBase .. '/' .. message('doc-subpage')
end
return mw.title.new(docpage)
end
function envFuncs.sandboxTitle()
--[[
-- Title object for the /sandbox subpage.
-- Messages:
-- 'sandbox-subpage' --> 'sandbox'
--]]
return mw.title.new(env.docpageBase .. '/' .. message('sandbox-subpage'))
end
function envFuncs.testcasesTitle()
--[[
-- Title object for the /testcases subpage.
-- Messages:
-- 'testcases-subpage' --> 'testcases'
--]]
return mw.title.new(env.docpageBase .. '/' .. message('testcases-subpage'))
end
function envFuncs.protectionLevels()
-- The protection levels table of the title object.
return env.title.protectionLevels
end
function envFuncs.subjectSpace()
-- The subject namespace number.
return mw.site.namespaces[env.title.namespace].subject.id
end
function envFuncs.docSpace()
-- The documentation namespace number. For most namespaces this is the
-- same as the subject namespace. However, pages in the Article, File,
-- MediaWiki or Category namespaces must have their /doc, /sandbox and
-- /testcases pages in talk space.
local subjectSpace = env.subjectSpace
if subjectSpace == 0 or subjectSpace == 6 or subjectSpace == 8 or subjectSpace == 14 then
return subjectSpace + 1
else
return subjectSpace
end
end
function envFuncs.docpageBase()
-- The base page of the /doc, /sandbox, and /testcases subpages.
-- For some namespaces this is the talk page, rather than the template page.
local templateTitle = env.templateTitle
local docSpace = env.docSpace
local docSpaceText = mw.site.namespaces[docSpace].name
-- Assemble the link. docSpace is never the main namespace, so we can hardcode the colon.
return docSpaceText .. ':' .. templateTitle.text
end
function envFuncs.compareUrl()
-- Diff link between the sandbox and the main template using [[Special:ComparePages]].
local templateTitle = env.templateTitle
local sandboxTitle = env.sandboxTitle
if templateTitle.exists and sandboxTitle.exists then
local compareUrl = mw.uri.canonicalUrl(
'Special:ComparePages',
{ page1 = templateTitle.prefixedText, page2 = sandboxTitle.prefixedText}
)
return tostring(compareUrl)
else
return nil
end
end
return env
end
----------------------------------------------------------------------------
-- Auxiliary templates
----------------------------------------------------------------------------
p.getModuleWikitext = makeInvokeFunc('_getModuleWikitext')
function p._getModuleWikitext(args, env)
local currentTitle = mw.title.getCurrentTitle()
if currentTitle.contentModel ~= 'Scribunto' then return end
pcall(require, currentTitle.prefixedText) -- if it fails, we don't care
local moduleWikitext = package.loaded["Module:Module wikitext"]
if moduleWikitext then
return moduleWikitext.main()
end
end
function p.sandboxNotice(args, env)
--[=[
-- Generates a sandbox notice for display above sandbox pages.
-- @args - a table of arguments passed by the user
-- @env - environment table containing title objects, etc., generated with p.getEnvironment
--
-- Messages:
-- 'sandbox-notice-image' --> '[[File:Sandbox.svg|50px|alt=|link=]]'
-- 'sandbox-notice-blurb' --> 'This is the $1 for $2.'
-- 'sandbox-notice-diff-blurb' --> 'This is the $1 for $2 ($3).'
-- 'sandbox-notice-pagetype-template' --> '[[Wikipedia:Template test cases|template sandbox]] page'
-- 'sandbox-notice-pagetype-module' --> '[[Wikipedia:Template test cases|module sandbox]] page'
-- 'sandbox-notice-pagetype-other' --> 'sandbox page'
-- 'sandbox-notice-compare-link-display' --> 'diff'
-- 'sandbox-notice-testcases-blurb' --> 'See also the companion subpage for $1.'
-- 'sandbox-notice-testcases-link-display' --> 'test cases'
-- 'sandbox-category' --> 'Template sandboxes'
-- 'module-sandbox-category' --> 'Module sandboxes'
-- 'other-sandbox-category' --> 'Sandboxes outside of template or module namespace'
--]=]
local title = env.title
local sandboxTitle = env.sandboxTitle
local templateTitle = env.templateTitle
local subjectSpace = env.subjectSpace
if not (subjectSpace and title and sandboxTitle and templateTitle
and mw.title.equals(title, sandboxTitle)) then
return nil
end
-- Build the table of arguments to pass to {{ombox}}. We need just two fields, "image" and "text".
local omargs = {}
omargs.image = message('sandbox-notice-image')
-- Get the text. We start with the opening blurb, which is something like
-- "This is the template sandbox for [[Template:Foo]] (diff)."
local text = ''
local pagetype, sandboxCat
if subjectSpace == 10 then
pagetype = message('sandbox-notice-pagetype-template')
sandboxCat = message('sandbox-category')
elseif subjectSpace == 828 then
pagetype = message('sandbox-notice-pagetype-module')
sandboxCat = message('module-sandbox-category')
else
pagetype = message('sandbox-notice-pagetype-other')
sandboxCat = message('other-sandbox-category')
end
local templateLink = makeWikilink(templateTitle.prefixedText)
local compareUrl = env.compareUrl
if compareUrl then
local compareDisplay = message('sandbox-notice-compare-link-display')
local compareLink = makeUrlLink(compareUrl, compareDisplay)
text = text .. message('sandbox-notice-diff-blurb', {pagetype, templateLink, compareLink})
else
text = text .. message('sandbox-notice-blurb', {pagetype, templateLink})
end
-- Get the test cases page blurb if the page exists. This is something like
-- "See also the companion subpage for [[Template:Foo/testcases|test cases]]."
local testcasesTitle = env.testcasesTitle
if testcasesTitle and testcasesTitle.exists then
if testcasesTitle.contentModel == "Scribunto" then
local testcasesLinkDisplay = message('sandbox-notice-testcases-link-display')
local testcasesRunLinkDisplay = message('sandbox-notice-testcases-run-link-display')
local testcasesLink = makeWikilink(testcasesTitle.prefixedText, testcasesLinkDisplay)
local testcasesRunLink = makeWikilink(testcasesTitle.talkPageTitle.prefixedText, testcasesRunLinkDisplay)
text = text .. '<br />' .. message('sandbox-notice-testcases-run-blurb', {testcasesLink, testcasesRunLink})
else
local testcasesLinkDisplay = message('sandbox-notice-testcases-link-display')
local testcasesLink = makeWikilink(testcasesTitle.prefixedText, testcasesLinkDisplay)
text = text .. '<br />' .. message('sandbox-notice-testcases-blurb', {testcasesLink})
end
end
-- Add the sandbox to the sandbox category.
omargs.text = text .. makeCategoryLink(sandboxCat)
-- 'documentation-clear'
return '<div class="' .. message('clear') .. '"></div>'
.. require('Module:Message box').main('ombox', omargs)
end
function p.protectionTemplate(env)
-- Generates the padlock icon in the top right.
-- @env - environment table containing title objects, etc., generated with p.getEnvironment
-- Messages:
-- 'protection-template' --> 'pp-template'
-- 'protection-template-args' --> {docusage = 'yes'}
local protectionLevels = env.protectionLevels
if not protectionLevels then
return nil
end
local editProt = protectionLevels.edit and protectionLevels.edit[1]
local moveProt = protectionLevels.move and protectionLevels.move[1]
if editProt then
-- The page is edit-protected.
return require('Module:Protection banner')._main{
message('protection-reason-edit'), small = true
}
elseif moveProt and moveProt ~= 'autoconfirmed' then
-- The page is move-protected but not edit-protected. Exclude move
-- protection with the level "autoconfirmed", as this is equivalent to
-- no move protection at all.
return require('Module:Protection banner')._main{
action = 'move', small = true
}
else
return nil
end
end
----------------------------------------------------------------------------
-- Start box
----------------------------------------------------------------------------
p.startBox = makeInvokeFunc('_startBox')
function p._startBox(args, env)
--[[
-- This function generates the start box.
-- @args - a table of arguments passed by the user
-- @env - environment table containing title objects, etc., generated with p.getEnvironment
--
-- The actual work is done by p.makeStartBoxLinksData and p.renderStartBoxLinks which make
-- the [view] [edit] [history] [purge] links, and by p.makeStartBoxData and p.renderStartBox
-- which generate the box HTML.
--]]
env = env or p.getEnvironment(args)
local links
local content = args.content
if not content or args[1] then
-- No need to include the links if the documentation is on the template page itself.
local linksData = p.makeStartBoxLinksData(args, env)
if linksData then
links = p.renderStartBoxLinks(linksData)
end
end
-- Generate the start box html.
local data = p.makeStartBoxData(args, env, links)
if data then
return p.renderStartBox(data)
else
-- User specified no heading.
return nil
end
end
function p.makeStartBoxLinksData(args, env)
--[[
-- Does initial processing of data to make the [view] [edit] [history] [purge] links.
-- @args - a table of arguments passed by the user
-- @env - environment table containing title objects, etc., generated with p.getEnvironment
--
-- Messages:
-- 'view-link-display' --> 'view'
-- 'edit-link-display' --> 'edit'
-- 'history-link-display' --> 'history'
-- 'purge-link-display' --> 'purge'
-- 'module-preload' --> 'Template:Documentation/preload-module-doc'
-- 'docpage-preload' --> 'Template:Documentation/preload'
-- 'create-link-display' --> 'create'
--]]
local subjectSpace = env.subjectSpace
local title = env.title
local docTitle = env.docTitle
if not title or not docTitle then
return nil
end
if docTitle.isRedirect then
docTitle = docTitle.redirectTarget
end
-- Create link if /doc doesn't exist.
local preload = args.preload
if not preload then
if subjectSpace == 828 then -- Module namespace
preload = message('module-preload')
else
preload = message('docpage-preload')
end
end
return {
title = title,
docTitle = docTitle,
-- View, display, edit, and purge links if /doc exists.
viewLinkDisplay = message('view-link-display'),
editLinkDisplay = message('edit-link-display'),
historyLinkDisplay = message('history-link-display'),
purgeLinkDisplay = message('purge-link-display'),
preload = preload,
createLinkDisplay = message('create-link-display')
}
end
function p.renderStartBoxLinks(data)
--[[
-- Generates the [view][edit][history][purge] or [create][purge] links from the data table.
-- @data - a table of data generated by p.makeStartBoxLinksData
--]]
local docTitle = data.docTitle
-- yes, we do intend to purge the template page on which the documentation appears
local purgeLink = makeWikilink("Special:Purge/" .. data.title.prefixedText, data.purgeLinkDisplay)
if docTitle.exists then
local viewLink = makeWikilink(docTitle.prefixedText, data.viewLinkDisplay)
local editLink = makeWikilink("Special:EditPage/" .. docTitle.prefixedText, data.editLinkDisplay)
local historyLink = makeWikilink("Special:PageHistory/" .. docTitle.prefixedText, data.historyLinkDisplay)
return "[" .. viewLink .. "] [" .. editLink .. "] [" .. historyLink .. "] [" .. purgeLink .. "]"
else
local createLink = makeUrlLink(docTitle:canonicalUrl{action = 'edit', preload = data.preload}, data.createLinkDisplay)
return "[" .. createLink .. "] [" .. purgeLink .. "]"
end
return ret
end
function p.makeStartBoxData(args, env, links)
--[=[
-- Does initial processing of data to pass to the start-box render function, p.renderStartBox.
-- @args - a table of arguments passed by the user
-- @env - environment table containing title objects, etc., generated with p.getEnvironment
-- @links - a string containing the [view][edit][history][purge] links - could be nil if there's an error.
--
-- Messages:
-- 'documentation-icon-wikitext' --> '[[File:Test Template Info-Icon - Version (2).svg|50px|link=|alt=]]'
-- 'template-namespace-heading' --> 'Template documentation'
-- 'module-namespace-heading' --> 'Module documentation'
-- 'file-namespace-heading' --> 'Summary'
-- 'other-namespaces-heading' --> 'Documentation'
-- 'testcases-create-link-display' --> 'create'
--]=]
local subjectSpace = env.subjectSpace
if not subjectSpace then
-- Default to an "other namespaces" namespace, so that we get at least some output
-- if an error occurs.
subjectSpace = 2
end
local data = {}
-- Heading
local heading = args.heading -- Blank values are not removed.
if heading == '' then
-- Don't display the start box if the heading arg is defined but blank.
return nil
end
if heading then
data.heading = heading
elseif subjectSpace == 10 then -- Template namespace
data.heading = message('documentation-icon-wikitext') .. ' ' .. message('template-namespace-heading')
elseif subjectSpace == 828 then -- Module namespace
data.heading = message('documentation-icon-wikitext') .. ' ' .. message('module-namespace-heading')
elseif subjectSpace == 6 then -- File namespace
data.heading = message('file-namespace-heading')
else
data.heading = message('other-namespaces-heading')
end
-- Heading CSS
local headingStyle = args['heading-style']
if headingStyle then
data.headingStyleText = headingStyle
else
-- 'documentation-heading'
data.headingClass = message('main-div-heading-class')
end
-- Data for the [view][edit][history][purge] or [create] links.
if links then
-- 'mw-editsection-like plainlinks'
data.linksClass = message('start-box-link-classes')
data.links = links
end
return data
end
function p.renderStartBox(data)
-- Renders the start box html.
-- @data - a table of data generated by p.makeStartBoxData.
local sbox = mw.html.create('div')
sbox
-- 'documentation-startbox'
:addClass(message('start-box-class'))
:newline()
:tag('span')
:addClass(data.headingClass)
:attr('id', 'documentation-heading')
:cssText(data.headingStyleText)
:wikitext(data.heading)
local links = data.links
if links then
sbox:tag('span')
:addClass(data.linksClass)
:attr('id', data.linksId)
:wikitext(links)
end
return tostring(sbox)
end
----------------------------------------------------------------------------
-- Documentation content
----------------------------------------------------------------------------
p.content = makeInvokeFunc('_content')
function p._content(args, env)
-- Displays the documentation contents
-- @args - a table of arguments passed by the user
-- @env - environment table containing title objects, etc., generated with p.getEnvironment
env = env or p.getEnvironment(args)
local docTitle = env.docTitle
local content = args.content
if not content and docTitle and docTitle.exists then
content = args._content or mw.getCurrentFrame():expandTemplate{title = docTitle.prefixedText}
end
-- The line breaks below are necessary so that "=== Headings ===" at the start and end
-- of docs are interpreted correctly.
return '\n' .. (content or '') .. '\n'
end
p.contentTitle = makeInvokeFunc('_contentTitle')
function p._contentTitle(args, env)
env = env or p.getEnvironment(args)
local docTitle = env.docTitle
if not args.content and docTitle and docTitle.exists then
return docTitle.prefixedText
else
return ''
end
end
----------------------------------------------------------------------------
-- End box
----------------------------------------------------------------------------
p.endBox = makeInvokeFunc('_endBox')
function p._endBox(args, env)
--[=[
-- This function generates the end box (also known as the link box).
-- @args - a table of arguments passed by the user
-- @env - environment table containing title objects, etc., generated with p.getEnvironment
--
--]=]
-- Get environment data.
env = env or p.getEnvironment(args)
local subjectSpace = env.subjectSpace
local docTitle = env.docTitle
if not subjectSpace or not docTitle then
return nil
end
-- Check whether we should output the end box at all. Add the end
-- box by default if the documentation exists or if we are in the
-- user, module or template namespaces.
local linkBox = args['link box']
if linkBox == 'off'
or not (
docTitle.exists
or subjectSpace == 2
or subjectSpace == 828
or subjectSpace == 10
)
then
return nil
end
-- Assemble the link box.
local text = ''
if linkBox then
text = text .. linkBox
else
text = text .. (p.makeDocPageBlurb(args, env) or '') -- "This documentation is transcluded from [[Foo]]."
if subjectSpace == 2 or subjectSpace == 10 or subjectSpace == 828 then
-- We are in the user, template or module namespaces.
-- Add sandbox and testcases links.
-- "Editors can experiment in this template's sandbox and testcases pages."
text = text .. (p.makeExperimentBlurb(args, env) or '') .. '<br />'
if not args.content and not args[1] then
-- "Please add categories to the /doc subpage."
-- Don't show this message with inline docs or with an explicitly specified doc page,
-- as then it is unclear where to add the categories.
text = text .. (p.makeCategoriesBlurb(args, env) or '')
end
text = text .. ' ' .. (p.makeSubpagesBlurb(args, env) or '') --"Subpages of this template"
end
end
local box = mw.html.create('div')
-- 'documentation-metadata'
box:attr('role', 'note')
:addClass(message('end-box-class'))
-- 'plainlinks'
:addClass(message('end-box-plainlinks'))
:wikitext(text)
:done()
return '\n' .. tostring(box)
end
function p.makeDocPageBlurb(args, env)
--[=[
-- Makes the blurb "This documentation is transcluded from [[Template:Foo]] (edit, history)".
-- @args - a table of arguments passed by the user
-- @env - environment table containing title objects, etc., generated with p.getEnvironment
--
-- Messages:
-- 'edit-link-display' --> 'edit'
-- 'history-link-display' --> 'history'
-- 'transcluded-from-blurb' -->
-- 'The above [[Wikipedia:Template documentation|documentation]]
-- is [[Help:Transclusion|transcluded]] from $1.'
-- 'module-preload' --> 'Template:Documentation/preload-module-doc'
-- 'create-link-display' --> 'create'
-- 'create-module-doc-blurb' -->
-- 'You might want to $1 a documentation page for this [[Wikipedia:Lua|Scribunto module]].'
--]=]
local docTitle = env.docTitle
if not docTitle then
return nil
end
if docTitle.exists then
-- /doc exists; link to it.
local docLink = makeWikilink(docTitle.prefixedText)
local editDisplay = message('edit-link-display')
local editLink = makeWikilink("Special:EditPage/" .. docTitle.prefixedText, editDisplay)
local historyDisplay = message('history-link-display')
local historyLink = makeWikilink("Special:PageHistory/" .. docTitle.prefixedText, historyDisplay)
return message('transcluded-from-blurb', {docLink})
.. ' '
.. makeToolbar(editLink, historyLink)
.. '<br />'
elseif env.subjectSpace == 828 then
-- /doc does not exist; ask to create it.
local createUrl = docTitle:canonicalUrl{action = 'edit', preload = message('module-preload')}
local createDisplay = message('create-link-display')
local createLink = makeUrlLink(createUrl, createDisplay)
return message('create-module-doc-blurb', {createLink})
.. '<br />'
end
end
function p.makeExperimentBlurb(args, env)
--[[
-- Renders the text "Editors can experiment in this template's sandbox (edit | diff) and testcases (edit) pages."
-- @args - a table of arguments passed by the user
-- @env - environment table containing title objects, etc., generated with p.getEnvironment
--
-- Messages:
-- 'sandbox-link-display' --> 'sandbox'
-- 'sandbox-edit-link-display' --> 'edit'
-- 'compare-link-display' --> 'diff'
-- 'module-sandbox-preload' --> 'Template:Documentation/preload-module-sandbox'
-- 'template-sandbox-preload' --> 'Template:Documentation/preload-sandbox'
-- 'sandbox-create-link-display' --> 'create'
-- 'mirror-edit-summary' --> 'Create sandbox version of $1'
-- 'mirror-link-display' --> 'mirror'
-- 'mirror-link-preload' --> 'Template:Documentation/mirror'
-- 'sandbox-link-display' --> 'sandbox'
-- 'testcases-link-display' --> 'testcases'
-- 'testcases-edit-link-display'--> 'edit'
-- 'template-sandbox-preload' --> 'Template:Documentation/preload-sandbox'
-- 'testcases-create-link-display' --> 'create'
-- 'testcases-link-display' --> 'testcases'
-- 'testcases-edit-link-display' --> 'edit'
-- 'module-testcases-preload' --> 'Template:Documentation/preload-module-testcases'
-- 'template-testcases-preload' --> 'Template:Documentation/preload-testcases'
-- 'experiment-blurb-module' --> 'Editors can experiment in this module's $1 and $2 pages.'
-- 'experiment-blurb-template' --> 'Editors can experiment in this template's $1 and $2 pages.'
--]]
local subjectSpace = env.subjectSpace
local templateTitle = env.templateTitle
local sandboxTitle = env.sandboxTitle
local testcasesTitle = env.testcasesTitle
local templatePage = templateTitle.prefixedText
if not subjectSpace or not templateTitle or not sandboxTitle or not testcasesTitle then
return nil
end
-- Make links.
local sandboxLinks, testcasesLinks
if sandboxTitle.exists then
local sandboxPage = sandboxTitle.prefixedText
local sandboxDisplay = message('sandbox-link-display')
local sandboxLink = makeWikilink(sandboxPage, sandboxDisplay)
local sandboxEditDisplay = message('sandbox-edit-link-display')
local sandboxEditLink = makeWikilink("Special:EditPage/" .. sandboxPage, sandboxEditDisplay)
local compareUrl = env.compareUrl
local compareLink
if compareUrl then
local compareDisplay = message('compare-link-display')
compareLink = makeUrlLink(compareUrl, compareDisplay)
end
sandboxLinks = sandboxLink .. ' ' .. makeToolbar(sandboxEditLink, compareLink)
else
local sandboxPreload
if subjectSpace == 828 then
sandboxPreload = message('module-sandbox-preload')
else
sandboxPreload = message('template-sandbox-preload')
end
local sandboxCreateUrl = sandboxTitle:canonicalUrl{action = 'edit', preload = sandboxPreload}
local sandboxCreateDisplay = message('sandbox-create-link-display')
local sandboxCreateLink = makeUrlLink(sandboxCreateUrl, sandboxCreateDisplay)
local mirrorSummary = message('mirror-edit-summary', {makeWikilink(templatePage)})
local mirrorPreload = message('mirror-link-preload')
local mirrorUrl = sandboxTitle:canonicalUrl{action = 'edit', preload = mirrorPreload, summary = mirrorSummary}
if subjectSpace == 828 then
mirrorUrl = sandboxTitle:canonicalUrl{action = 'edit', preload = templateTitle.prefixedText, summary = mirrorSummary}
end
local mirrorDisplay = message('mirror-link-display')
local mirrorLink = makeUrlLink(mirrorUrl, mirrorDisplay)
sandboxLinks = message('sandbox-link-display') .. ' ' .. makeToolbar(sandboxCreateLink, mirrorLink)
end
if testcasesTitle.exists then
local testcasesPage = testcasesTitle.prefixedText
local testcasesDisplay = message('testcases-link-display')
local testcasesLink = makeWikilink(testcasesPage, testcasesDisplay)
local testcasesEditUrl = testcasesTitle:canonicalUrl{action = 'edit'}
local testcasesEditDisplay = message('testcases-edit-link-display')
local testcasesEditLink = makeWikilink("Special:EditPage/" .. testcasesPage, testcasesEditDisplay)
-- for Modules, add testcases run link if exists
if testcasesTitle.contentModel == "Scribunto" and testcasesTitle.talkPageTitle and testcasesTitle.talkPageTitle.exists then
local testcasesRunLinkDisplay = message('testcases-run-link-display')
local testcasesRunLink = makeWikilink(testcasesTitle.talkPageTitle.prefixedText, testcasesRunLinkDisplay)
testcasesLinks = testcasesLink .. ' ' .. makeToolbar(testcasesEditLink, testcasesRunLink)
else
testcasesLinks = testcasesLink .. ' ' .. makeToolbar(testcasesEditLink)
end
else
local testcasesPreload
if subjectSpace == 828 then
testcasesPreload = message('module-testcases-preload')
else
testcasesPreload = message('template-testcases-preload')
end
local testcasesCreateUrl = testcasesTitle:canonicalUrl{action = 'edit', preload = testcasesPreload}
local testcasesCreateDisplay = message('testcases-create-link-display')
local testcasesCreateLink = makeUrlLink(testcasesCreateUrl, testcasesCreateDisplay)
testcasesLinks = message('testcases-link-display') .. ' ' .. makeToolbar(testcasesCreateLink)
end
local messageName
if subjectSpace == 828 then
messageName = 'experiment-blurb-module'
else
messageName = 'experiment-blurb-template'
end
return message(messageName, {sandboxLinks, testcasesLinks})
end
function p.makeCategoriesBlurb(args, env)
--[[
-- Generates the text "Please add categories to the /doc subpage."
-- @args - a table of arguments passed by the user
-- @env - environment table containing title objects, etc., generated with p.getEnvironment
-- Messages:
-- 'doc-link-display' --> '/doc'
-- 'add-categories-blurb' --> 'Please add categories to the $1 subpage.'
--]]
local docTitle = env.docTitle
if not docTitle then
return nil
end
local docPathLink = makeWikilink(docTitle.prefixedText, message('doc-link-display'))
return message('add-categories-blurb', {docPathLink})
end
function p.makeSubpagesBlurb(args, env)
--[[
-- Generates the "Subpages of this template" link.
-- @args - a table of arguments passed by the user
-- @env - environment table containing title objects, etc., generated with p.getEnvironment
-- Messages:
-- 'template-pagetype' --> 'template'
-- 'module-pagetype' --> 'module'
-- 'default-pagetype' --> 'page'
-- 'subpages-link-display' --> 'Subpages of this $1'
--]]
local subjectSpace = env.subjectSpace
local templateTitle = env.templateTitle
if not subjectSpace or not templateTitle then
return nil
end
local pagetype
if subjectSpace == 10 then
pagetype = message('template-pagetype')
elseif subjectSpace == 828 then
pagetype = message('module-pagetype')
else
pagetype = message('default-pagetype')
end
local subpagesLink = makeWikilink(
'Special:PrefixIndex/' .. templateTitle.prefixedText .. '/',
message('subpages-link-display', {pagetype})
)
return message('subpages-blurb', {subpagesLink})
end
----------------------------------------------------------------------------
-- Tracking categories
----------------------------------------------------------------------------
function p.addTrackingCategories(env)
--[[
-- Check if {{documentation}} is transcluded on a /doc or /testcases page.
-- @env - environment table containing title objects, etc., generated with p.getEnvironment
-- Messages:
-- 'display-strange-usage-category' --> true
-- 'doc-subpage' --> 'doc'
-- 'testcases-subpage' --> 'testcases'
-- 'strange-usage-category' --> 'Wikipedia pages with strange ((documentation)) usage'
--
-- /testcases pages in the module namespace are not categorised, as they may have
-- {{documentation}} transcluded automatically.
--]]
local title = env.title
local subjectSpace = env.subjectSpace
if not title or not subjectSpace then
return nil
end
local subpage = title.subpageText
if message('display-strange-usage-category', nil, 'boolean')
and (
subpage == message('doc-subpage')
or subjectSpace ~= 828 and subpage == message('testcases-subpage')
)
then
return makeCategoryLink(message('strange-usage-category'))
end
return ''
end
return p
d6c1bffca24be2d81fa882315ac613f5bb6b227c
Module:Effective protection level
828
60
79
2024-01-15T21:44:42Z
wikipedia>Pppery
0
Per [[WP:ACPERM]], you need to be autoconfirmed to create pages in mainspace
Scribunto
text/plain
local p = {}
-- Returns the permission required to perform a given action on a given title.
-- If no title is specified, the title of the page being displayed is used.
function p._main(action, pagename)
local title
if type(pagename) == 'table' and pagename.prefixedText then
title = pagename
elseif pagename then
title = mw.title.new(pagename)
else
title = mw.title.getCurrentTitle()
end
pagename = title.prefixedText
if action == 'autoreview' then
local level = mw.ext.FlaggedRevs.getStabilitySettings(title)
level = level and level.autoreview
if level == 'review' then
return 'reviewer'
elseif level ~= '' then
return level
else
return nil -- not '*'. a page not being PC-protected is distinct from it being PC-protected with anyone able to review. also not '', as that would mean PC-protected but nobody can review
end
elseif action ~= 'edit' and action ~= 'move' and action ~= 'create' and action ~= 'upload' and action ~= 'undelete' then
error( 'First parameter must be one of edit, move, create, upload, undelete, autoreview', 2 )
end
if title.namespace == 8 then -- MediaWiki namespace
if title.text:sub(-3) == '.js' or title.text:sub(-4) == '.css' or title.contentModel == 'javascript' or title.contentModel == 'css' then -- site JS or CSS page
return 'interfaceadmin'
else -- any non-JS/CSS MediaWiki page
return 'sysop'
end
elseif title.namespace == 2 and title.isSubpage then
if title.contentModel == 'javascript' or title.contentModel == 'css' then -- user JS or CSS page
return 'interfaceadmin'
elseif title.contentModel == 'json' then -- user JSON page
return 'sysop'
end
end
if action == 'undelete' then
return 'sysop'
end
local level = title.protectionLevels[action] and title.protectionLevels[action][1]
if level == 'sysop' or level == 'editprotected' then
return 'sysop'
elseif title.cascadingProtection.restrictions[action] and title.cascadingProtection.restrictions[action][1] then -- used by a cascading-protected page
return 'sysop'
elseif level == 'templateeditor' then
return 'templateeditor'
elseif action == 'move' then
local blacklistentry = mw.ext.TitleBlacklist.test('edit', pagename) -- Testing action edit is correct, since this is for the source page. The target page name gets tested with action move.
if blacklistentry and not blacklistentry.params.autoconfirmed then
return 'templateeditor'
elseif title.namespace == 6 then
return 'filemover'
elseif level == 'extendedconfirmed' then
return 'extendedconfirmed'
else
return 'autoconfirmed'
end
end
local blacklistentry = mw.ext.TitleBlacklist.test(action, pagename)
if blacklistentry then
if not blacklistentry.params.autoconfirmed then
return 'templateeditor'
elseif level == 'extendedconfirmed' then
return 'extendedconfirmed'
else
return 'autoconfirmed'
end
elseif level == 'editsemiprotected' then -- create-semiprotected pages return this for some reason
return 'autoconfirmed'
elseif level then
return level
elseif action == 'upload' then
return 'autoconfirmed'
elseif action == 'create' and title.namespace % 2 == 0 and title.namespace ~= 118 then -- You need to be registered, but not autoconfirmed, to create non-talk pages other than drafts
if title.namespace == 0 then
return 'autoconfirmed' -- Per [[WP:ACPERM]], you need to be autoconfirmed to create pages in mainspace
end
return 'user'
else
return '*'
end
end
setmetatable(p, { __index = function(t, k)
return function(frame)
return t._main(k, frame.args[1])
end
end })
return p
b6cb1e5589ec6575118f60841644cd65defa7174
Template:Template display
10
140
239
2024-01-28T01:39:39Z
wikipedia>Jonesey95
0
add nomobile720 option for Template:A-Z multipage list
wikitext
text/x-wiki
<includeonly>{{#invoke:Message box|ombox|type=notice
|image={{#switch:{{{1}}}|adaptive=[[File:Different devices simple.svg|65x65px|link=|alt=]]|nomobile=[[File:Handheld devices no.svg|55px|link=|alt=]]|nodesktop=[[File:Desktop devices no.svg|55px|link=|alt=]]}}
|text={{#switch:{{{1}}}
| adaptive = This template is [[Adaptive web design|responsive]] and <strong>displays differently in mobile and desktop view</strong>. Read the documentation for an explanation of the differences and why they exist.
| nomobile = This template does ''not'' display in the mobile view of Wikipedia; it is <strong>desktop only</strong>. Read the documentation for an explanation.
| nomobile720 = This template does ''not'' display in the mobile view of Wikipedia when the window is less than 720 pixels wide. Read the documentation for an explanation.
| nodesktop = This template does ''not'' display in the desktop view of Wikipedia; it is <strong>mobile only</strong>. Read the documentation for an explanation.
| nomobilesidebar = This template does ''not'' display in the mobile view of Wikipedia; it is <strong>desktop only</strong>. Read the [[Template:Sidebar/doc|parent documentation]] for an explanation.
| badmobile = This template contains coding that is not compatible with [[Help:Mobile access|mobile versions of Wikipedia]], causing display and [[Wikipedia:Manual of Style/Accessibility|accessibility problems]]. Read the documentation for an explanation.
| vector2022 = This template does not work properly in the [[Wikipedia:Vector 2022|Vector 2022]] skin. Read the documentation for an explanation.
| #default = {{{1}}}
}}}}</includeonly><noinclude>
{{Documentation}}
</noinclude>
52fab071b5e33fcc6478fd3139f558ad1e95c985
Module:High-use
828
79
117
2024-02-07T02:05:53Z
wikipedia>Pppery
0
Don't auto-categorize redirects
Scribunto
text/plain
local p = {}
-- _fetch looks at the "demo" argument.
local _fetch = require('Module:Transclusion_count').fetch
local yesno = require('Module:Yesno')
function p.num(frame, count)
if count == nil then
if yesno(frame.args['fetch']) == false then
if (frame.args[1] or '') ~= '' then count = tonumber(frame.args[1]) end
else
count = _fetch(frame)
end
end
-- Build output string
local return_value = ""
if count == nil then
if frame.args[1] == "risk" then
return "a very large number of"
else
return "many"
end
else
-- Use 2 significant figures for smaller numbers and 3 for larger ones
local sigfig = 2
if count >= 100000 then
sigfig = 3
end
-- Prepare to round to appropriate number of sigfigs
local f = math.floor(math.log10(count)) - sigfig + 1
-- Round and insert "approximately" or "+" when appropriate
if (frame.args[2] == "yes") or (mw.ustring.sub(frame.args[1],-1) == "+") then
-- Round down
return_value = string.format("%s+", mw.getContentLanguage():formatNum(math.floor( (count / 10^(f)) ) * (10^(f))) )
else
-- Round to nearest
return_value = string.format("approximately %s", mw.getContentLanguage():formatNum(math.floor( (count / 10^(f)) + 0.5) * (10^(f))) )
end
-- Insert percentage of pages if that is likely to be >= 1% and when |no-percent= not set to yes
if count and count > 250000 and not yesno (frame:getParent().args['no-percent']) then
local percent = math.floor( ( (count/frame:callParserFunction('NUMBEROFPAGES', 'R') ) * 100) + 0.5)
if percent >= 1 then
return_value = string.format("%s pages, or roughly %s%% of all", return_value, percent)
end
end
end
return return_value
end
-- Actions if there is a large (greater than or equal to 100,000) transclusion count
function p.risk(frame)
if frame.args[1] == "risk" then
return "risk"
else
local count = _fetch(frame)
if count and count >= 100000 then
return "risk"
end
end
return ""
end
function p.text(frame, count)
-- Only show the information about how this template gets updated if someone
-- is actually editing the page and maybe trying to update the count.
local bot_text = (frame:preprocess("{{REVISIONID}}") == "") and "\n\n----\n'''Preview message''': Transclusion count updated automatically ([[Template:High-use/doc#Technical details|see documentation]])." or ''
if count == nil then
if yesno(frame.args['fetch']) == false then
if (frame.args[1] or '') ~= '' then count = tonumber(frame.args[1]) end
else
count = _fetch(frame)
end
end
local title = mw.title.getCurrentTitle()
if title.subpageText == "doc" or title.subpageText == "sandbox" then
title = title.basePageTitle
end
local systemMessages = frame.args['system']
if frame.args['system'] == '' then
systemMessages = nil
end
-- This retrieves the project URL automatically to simplify localiation.
local templateCount = ('on [https://linkcount.toolforge.org/index.php?project=%s&page=%s %s pages]'):format(
mw.title.getCurrentTitle():fullUrl():gsub('//(.-)/.*', '%1'),
mw.uri.encode(title.fullText), p.num(frame, count))
local used_on_text = "'''This " .. (mw.title.getCurrentTitle().namespace == 828 and "Lua module" or "template") .. ' is used ';
if systemMessages then
used_on_text = used_on_text .. systemMessages ..
((count and count > 2000) and ("''', and " .. templateCount) or ("'''"))
else
used_on_text = used_on_text .. templateCount .. "'''"
end
local sandbox_text = ("%s's [[%s/sandbox|/sandbox]] or [[%s/testcases|/testcases]] subpages, or in your own [[%s]]. "):format(
(mw.title.getCurrentTitle().namespace == 828 and "module" or "template"),
title.fullText, title.fullText,
mw.title.getCurrentTitle().namespace == 828 and "Module:Sandbox|module sandbox" or "Wikipedia:User pages#SUB|user subpage"
)
local infoArg = frame.args["info"] ~= "" and frame.args["info"]
if (systemMessages or frame.args[1] == "risk" or (count and count >= 100000) ) then
local info = systemMessages and '.<br/>Changes to it can cause immediate changes to the Wikipedia user interface.' or '.'
if infoArg then
info = info .. "<br />" .. infoArg
end
sandbox_text = info .. '<br /> To avoid major disruption' ..
(count and count >= 100000 and ' and server load' or '') ..
', any changes should be tested in the ' .. sandbox_text ..
'The tested changes can be added to this page in a single edit. '
else
sandbox_text = (infoArg and ('.<br />' .. infoArg .. ' C') or ' and c') ..
'hanges may be widely noticed. Test changes in the ' .. sandbox_text
end
local discussion_text = systemMessages and 'Please discuss changes ' or 'Consider discussing changes '
if frame.args["2"] and frame.args["2"] ~= "" and frame.args["2"] ~= "yes" then
discussion_text = string.format("%sat [[%s]]", discussion_text, frame.args["2"])
else
discussion_text = string.format("%son the [[%s|talk page]]", discussion_text, title.talkPageTitle.fullText )
end
return used_on_text .. sandbox_text .. discussion_text .. " before implementing them." .. bot_text
end
function p.main(frame)
local count = nil
if yesno(frame.args['fetch']) == false then
if (frame.args[1] or '') ~= '' then count = tonumber(frame.args[1]) end
else
count = _fetch(frame)
end
local image = "[[File:Ambox warning yellow.svg|40px|alt=Warning|link=]]"
local type_param = "style"
local epilogue = ''
if frame.args['system'] and frame.args['system'] ~= '' then
image = "[[File:Ambox important.svg|40px|alt=Warning|link=]]"
type_param = "content"
local nocat = frame:getParent().args['nocat'] or frame.args['nocat']
local categorise = (nocat == '' or not yesno(nocat))
if categorise and not mw.title.getCurrentTitle().isRedirect then
epilogue = frame:preprocess('{{Sandbox other||{{#switch:{{#invoke:Effective protection level|{{#switch:{{NAMESPACE}}|File=upload|#default=edit}}|{{FULLPAGENAME}}}}|sysop|templateeditor|interfaceadmin=|#default=[[Category:Pages used in system messages needing protection]]}}}}')
end
elseif (frame.args[1] == "risk" or (count and count >= 100000)) then
image = "[[File:Ambox warning orange.svg|40px|alt=Warning|link=]]"
type_param = "content"
end
if frame.args["form"] == "editnotice" then
return frame:expandTemplate{
title = 'editnotice',
args = {
["image"] = image,
["text"] = p.text(frame, count),
["expiry"] = (frame.args["expiry"] or "")
}
} .. epilogue
else
return require('Module:Message box').main('ombox', {
type = type_param,
image = image,
text = p.text(frame, count),
expiry = (frame.args["expiry"] or "")
}) .. epilogue
end
end
return p
e22649bbbdf0185575aade09174113873db5066a
Template:Clear
10
109
177
2024-02-13T14:32:36Z
wikipedia>Redrose64
0
pass class through
wikitext
text/x-wiki
<div style="clear:{{{1|both}}};" class={{{class|}}}></div><noinclude>
{{documentation}}
</noinclude>
5b24b9fd5cc166a8c486e2422d5df465206ed39c
Module:Ns has subpages
828
102
163
2024-02-17T04:01:43Z
wikipedia>Pppery
0
Changed protection settings for "[[Module:Ns has subpages]]": Per template ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite))
Scribunto
text/plain
-- This module implements [[Template:Ns has subpages]].
-- While the template is fairly simple, this information is made available to
-- Lua directly, so using a module means that we don't have to update the
-- template as new namespaces are added.
local p = {}
function p._main(ns, frame)
-- Get the current namespace if we were not passed one.
if not ns then
ns = mw.title.getCurrentTitle().namespace
end
-- Look up the namespace table from mw.site.namespaces. This should work
-- for a majority of cases.
local nsTable = mw.site.namespaces[ns]
-- Try using string matching to get the namespace from page names.
-- Do a quick and dirty bad title check to try and make sure we do the same
-- thing as {{NAMESPACE}} in most cases.
if not nsTable and type(ns) == 'string' and not ns:find('[<>|%[%]{}]') then
local nsStripped = ns:gsub('^[_%s]*:', '')
nsStripped = nsStripped:gsub(':.*$', '')
nsTable = mw.site.namespaces[nsStripped]
end
-- If we still have no match then try the {{NAMESPACE}} parser function,
-- which should catch the remainder of cases. Don't use a mw.title object,
-- as this would increment the expensive function count for each new page
-- tested.
if not nsTable then
frame = frame or mw.getCurrentFrame()
local nsProcessed = frame:callParserFunction('NAMESPACE', ns)
nsTable = nsProcessed and mw.site.namespaces[nsProcessed]
end
return nsTable and nsTable.hasSubpages
end
function p.main(frame)
local ns = frame:getParent().args[1]
if ns then
ns = ns:match('^%s*(.-)%s*$') -- trim whitespace
ns = tonumber(ns) or ns
end
local hasSubpages = p._main(ns, frame)
return hasSubpages and 'yes' or ''
end
return p
e133068ba73738b16e1e3eba47735516a461eb5b
Template:Plainlist
10
58
75
2024-02-17T04:49:57Z
wikipedia>Pppery
0
Changed protection settings for "[[Template:Plainlist]]": Used in [[Template:No article text]] - on [[WP:CASC]] ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite))
wikitext
text/x-wiki
<templatestyles src="Plainlist/styles.css"/><div class="plainlist {{{class|}}}" {{#if:{{{style|}}}{{{indent|}}}|style="{{#if:{{{indent|}}}|margin-left: {{#expr:{{{indent}}}*1.6}}em;}} {{{style|}}}"}}>{{#if:{{{1|}}}|
{{{1}}}
</div>}}<noinclude></div>
{{documentation}}
</noinclude>
582fe7098c25c1ecfc0ad32f62ecd674ebe2bdf0
Template:Endplainlist
10
76
111
2024-02-17T04:52:14Z
wikipedia>Pppery
0
Protected "[[Template:Endplainlist]]": Oops ([Edit=Require administrator access] (indefinite) [Move=Require administrator access] (indefinite))
wikitext
text/x-wiki
<includeonly></div></includeonly><noinclude>
{{documentation|Template:Plainlist/doc}}
</noinclude>
d545c41582328dd4f197e2b1848c8ad7392b92e0
Template:Navbox visibility
10
142
243
2024-02-20T12:23:58Z
wikipedia>Primefac
0
update (TPER)
wikitext
text/x-wiki
Templates using the classes <code>class=navbox</code> ({{tl|navbox}}) or <code>class=nomobile</code> ({{tl|sidebar}}) are not displayed on the [https://en.m.wikipedia.org/ mobile web site] of English Wikipedia. Mobile page views account for approximately 66% of all page views (90-day average {{as of|January 2024|lc=y}}).<noinclude>
{{documentation}}
</noinclude>
4e8393af2aa8c53adad3fa90c687120d5726d026
Module:Protection banner/config
828
67
93
2024-03-01T12:45:46Z
wikipedia>SilverLocust
0
Fix for [[Template talk:Db-a1]] and similar template-protected non-template redirects being miscategorized into [[Category:Wikipedia fully protected pages]].
Scribunto
text/plain
-- This module provides configuration data for [[Module:Protection banner]].
return {
--------------------------------------------------------------------------------
--
-- BANNER DATA
--
--------------------------------------------------------------------------------
--[[
-- Banner data consists of six fields:
-- * text - the main protection text that appears at the top of protection
-- banners.
-- * explanation - the text that appears below the main protection text, used
-- to explain the details of the protection.
-- * tooltip - the tooltip text you see when you move the mouse over a small
-- padlock icon.
-- * link - the page that the small padlock icon links to.
-- * alt - the alt text for the small padlock icon. This is also used as tooltip
-- text for the large protection banners.
-- * image - the padlock image used in both protection banners and small padlock
-- icons.
--
-- The module checks in three separate tables to find a value for each field.
-- First it checks the banners table, which has values specific to the reason
-- for the page being protected. Then the module checks the defaultBanners
-- table, which has values specific to each protection level. Finally, the
-- module checks the masterBanner table, which holds data for protection
-- templates to use if no data has been found in the previous two tables.
--
-- The values in the banner data can take parameters. These are specified
-- using ${TEXTLIKETHIS} (a dollar sign preceding a parameter name
-- enclosed in curly braces).
--
-- Available parameters:
--
-- ${CURRENTVERSION} - a link to the page history or the move log, with the
-- display message "current-version-edit-display" or
-- "current-version-move-display".
--
-- ${EDITREQUEST} - a link to create an edit request for the current page.
--
-- ${EXPLANATIONBLURB} - an explanation blurb, e.g. "Please discuss any changes
-- on the talk page; you may submit a request to ask an administrator to make
-- an edit if it is minor or supported by consensus."
--
-- ${IMAGELINK} - a link to set the image to, depending on the protection
-- action and protection level.
--
-- ${INTROBLURB} - the PROTECTIONBLURB parameter, plus the expiry if an expiry
-- is set. E.g. "Editing of this page by new or unregistered users is currently
-- disabled until dd Month YYYY."
--
-- ${INTROFRAGMENT} - the same as ${INTROBLURB}, but without final punctuation
-- so that it can be used in run-on sentences.
--
-- ${PAGETYPE} - the type of the page, e.g. "article" or "template".
-- Defined in the cfg.pagetypes table.
--
-- ${PROTECTIONBLURB} - a blurb explaining the protection level of the page, e.g.
-- "Editing of this page by new or unregistered users is currently disabled"
--
-- ${PROTECTIONDATE} - the protection date, if it has been supplied to the
-- template.
--
-- ${PROTECTIONLEVEL} - the protection level, e.g. "fully protected" or
-- "semi-protected".
--
-- ${PROTECTIONLOG} - a link to the protection log or the pending changes log,
-- depending on the protection action.
--
-- ${TALKPAGE} - a link to the talk page. If a section is specified, links
-- straight to that talk page section.
--
-- ${TOOLTIPBLURB} - uses the PAGETYPE, PROTECTIONTYPE and EXPIRY parameters to
-- create a blurb like "This template is semi-protected", or "This article is
-- move-protected until DD Month YYYY".
--
-- ${VANDAL} - links for the specified username (or the root page name)
-- using Module:Vandal-m.
--
-- Functions
--
-- For advanced users, it is possible to use Lua functions instead of strings
-- in the banner config tables. Using functions gives flexibility that is not
-- possible just by using parameters. Functions take two arguments, the
-- protection object and the template arguments, and they must output a string.
--
-- For example:
--
-- text = function (protectionObj, args)
-- if protectionObj.level == 'autoconfirmed' then
-- return 'foo'
-- else
-- return 'bar'
-- end
-- end
--
-- Some protection object properties and methods that may be useful:
-- protectionObj.action - the protection action
-- protectionObj.level - the protection level
-- protectionObj.reason - the protection reason
-- protectionObj.expiry - the expiry. Nil if unset, the string "indef" if set
-- to indefinite, and the protection time in unix time if temporary.
-- protectionObj.protectionDate - the protection date in unix time, or nil if
-- unspecified.
-- protectionObj.bannerConfig - the banner config found by the module. Beware
-- of editing the config field used by the function, as it could create an
-- infinite loop.
-- protectionObj:isProtected - returns a boolean showing whether the page is
-- protected.
-- protectionObj:isTemporary - returns a boolean showing whether the expiry is
-- temporary.
-- protectionObj:isIncorrect - returns a boolean showing whether the protection
-- template is incorrect.
--]]
-- The master banner data, used if no values have been found in banners or
-- defaultBanners.
masterBanner = {
text = '${INTROBLURB}',
explanation = '${EXPLANATIONBLURB}',
tooltip = '${TOOLTIPBLURB}',
link = '${IMAGELINK}',
alt = 'Page ${PROTECTIONLEVEL}'
},
-- The default banner data. This holds banner data for different protection
-- levels.
-- *required* - this table needs edit, move, autoreview and upload subtables.
defaultBanners = {
edit = {},
move = {},
autoreview = {
default = {
alt = 'Page protected with pending changes',
tooltip = 'All edits by unregistered and new users are subject to review prior to becoming visible to unregistered users',
image = 'Pending-protection-shackle.svg'
}
},
upload = {}
},
-- The banner data. This holds banner data for different protection reasons.
-- In fact, the reasons specified in this table control which reasons are
-- valid inputs to the first positional parameter.
--
-- There is also a non-standard "description" field that can be used for items
-- in this table. This is a description of the protection reason for use in the
-- module documentation.
--
-- *required* - this table needs edit, move, autoreview and upload subtables.
banners = {
edit = {
blp = {
description = 'For pages protected to promote compliance with the'
.. ' [[Wikipedia:Biographies of living persons'
.. '|biographies of living persons]] policy',
text = '${INTROFRAGMENT} to promote compliance with'
.. ' [[Wikipedia:Biographies of living persons'
.. "|Wikipedia's policy on the biographies"
.. ' of living people]].',
tooltip = '${TOOLTIPFRAGMENT} to promote compliance with the policy on'
.. ' biographies of living persons',
},
dmca = {
description = 'For pages protected by the Wikimedia Foundation'
.. ' due to [[Digital Millennium Copyright Act]] takedown requests',
explanation = function (protectionObj, args)
local ret = 'Pursuant to a rights owner notice under the Digital'
.. ' Millennium Copyright Act (DMCA) regarding some content'
.. ' in this article, the Wikimedia Foundation acted under'
.. ' applicable law and took down and restricted the content'
.. ' in question.'
if args.notice then
ret = ret .. ' A copy of the received notice can be found here: '
.. args.notice .. '.'
end
ret = ret .. ' For more information, including websites discussing'
.. ' how to file a counter-notice, please see'
.. " [[Wikipedia:Office actions]] and the article's ${TALKPAGE}."
.. "'''Do not remove this template from the article until the"
.. " restrictions are withdrawn'''."
return ret
end,
image = 'Office-protection-shackle.svg',
},
dispute = {
description = 'For pages protected due to editing disputes',
text = function (protectionObj, args)
-- Find the value of "disputes".
local display = 'disputes'
local disputes
if args.section then
disputes = string.format(
'[[%s:%s#%s|%s]]',
mw.site.namespaces[protectionObj.title.namespace].talk.name,
protectionObj.title.text,
args.section,
display
)
else
disputes = display
end
-- Make the blurb, depending on the expiry.
local msg
if type(protectionObj.expiry) == 'number' then
msg = '${INTROFRAGMENT} or until editing %s have been resolved.'
else
msg = '${INTROFRAGMENT} until editing %s have been resolved.'
end
return string.format(msg, disputes)
end,
explanation = "This protection is '''not''' an endorsement of the"
.. ' ${CURRENTVERSION}. ${EXPLANATIONBLURB}',
tooltip = '${TOOLTIPFRAGMENT} due to editing disputes',
},
ecp = {
description = 'For articles in topic areas authorized by'
.. ' [[Wikipedia:Arbitration Committee|ArbCom]] or'
.. ' meets the criteria for community use',
tooltip = 'This ${PAGETYPE} is ${PROTECTIONLEVEL}',
alt = 'Extended-protected ${PAGETYPE}',
},
mainpage = {
description = 'For pages protected for being displayed on the [[Main Page]]',
text = 'This file is currently'
.. ' [[Wikipedia:This page is protected|protected]] from'
.. ' editing because it is currently or will soon be displayed'
.. ' on the [[Main Page]].',
explanation = 'Images on the Main Page are protected due to their high'
.. ' visibility. Please discuss any necessary changes on the ${TALKPAGE}.'
.. '<br /><span style="font-size:90%;">'
.. "'''Administrators:''' Once this image is definitely off the Main Page,"
.. ' please unprotect this file, or reduce to semi-protection,'
.. ' as appropriate.</span>',
},
office = {
description = 'For pages protected by the Wikimedia Foundation',
text = function (protectionObj, args)
local ret = 'This ${PAGETYPE} is currently under the'
.. ' scrutiny of the'
.. ' [[Wikipedia:Office actions|Wikimedia Foundation Office]]'
.. ' and is protected.'
if protectionObj.protectionDate then
ret = ret .. ' It has been protected since ${PROTECTIONDATE}.'
end
return ret
end,
explanation = "If you can edit this page, please discuss all changes and"
.. " additions on the ${TALKPAGE} first. '''Do not remove protection from this"
.. " page unless you are authorized by the Wikimedia Foundation to do"
.. " so.'''",
image = 'Office-protection-shackle.svg',
},
reset = {
description = 'For pages protected by the Wikimedia Foundation and'
.. ' "reset" to a bare-bones version',
text = 'This ${PAGETYPE} is currently under the'
.. ' scrutiny of the'
.. ' [[Wikipedia:Office actions|Wikimedia Foundation Office]]'
.. ' and is protected.',
explanation = function (protectionObj, args)
local ret = ''
if protectionObj.protectionDate then
ret = ret .. 'On ${PROTECTIONDATE} this ${PAGETYPE} was'
else
ret = ret .. 'This ${PAGETYPE} has been'
end
ret = ret .. ' reduced to a'
.. ' simplified, "bare bones" version so that it may be completely'
.. ' rewritten to ensure it meets the policies of'
.. ' [[WP:NPOV|Neutral Point of View]] and [[WP:V|Verifiability]].'
.. ' Standard Wikipedia policies will apply to its rewriting—which'
.. ' will eventually be open to all editors—and will be strictly'
.. ' enforced. The ${PAGETYPE} has been ${PROTECTIONLEVEL} while'
.. ' it is being rebuilt.\n\n'
.. 'Any insertion of material directly from'
.. ' pre-protection revisions of the ${PAGETYPE} will be removed, as'
.. ' will any material added to the ${PAGETYPE} that is not properly'
.. ' sourced. The associated talk page(s) were also cleared on the'
.. " same date.\n\n"
.. "If you can edit this page, please discuss all changes and"
.. " additions on the ${TALKPAGE} first. '''Do not override"
.. " this action, and do not remove protection from this page,"
.. " unless you are authorized by the Wikimedia Foundation"
.. " to do so. No editor may remove this notice.'''"
return ret
end,
image = 'Office-protection-shackle.svg',
},
sock = {
description = 'For pages protected due to'
.. ' [[Wikipedia:Sock puppetry|sock puppetry]]',
text = '${INTROFRAGMENT} to prevent [[Wikipedia:Sock puppetry|sock puppets]] of'
.. ' [[Wikipedia:Blocking policy|blocked]] or'
.. ' [[Wikipedia:Banning policy|banned users]]'
.. ' from editing it.',
tooltip = '${TOOLTIPFRAGMENT} to prevent sock puppets of blocked or banned users from'
.. ' editing it',
},
template = {
description = 'For [[Wikipedia:High-risk templates|high-risk]]'
.. ' templates and Lua modules',
text = 'This is a permanently [[Help:Protection|protected]] ${PAGETYPE},'
.. ' as it is [[Wikipedia:High-risk templates|high-risk]].',
explanation = 'Please discuss any changes on the ${TALKPAGE}; you may'
.. ' ${EDITREQUEST} to ask an'
.. ' [[Wikipedia:Administrators|administrator]] or'
.. ' [[Wikipedia:Template editor|template editor]] to make an edit if'
.. ' it is [[Help:Minor edit#When to mark an edit as a minor edit'
.. '|uncontroversial]] or supported by'
.. ' [[Wikipedia:Consensus|consensus]]. You can also'
.. ' [[Wikipedia:Requests for page protection|request]] that the page be'
.. ' unprotected.',
tooltip = 'This high-risk ${PAGETYPE} is permanently ${PROTECTIONLEVEL}'
.. ' to prevent vandalism',
alt = 'Permanently protected ${PAGETYPE}',
},
usertalk = {
description = 'For pages protected against disruptive edits by a'
.. ' particular user',
text = '${INTROFRAGMENT} to prevent ${VANDAL} from using it to make disruptive edits,'
.. ' such as abusing the'
.. ' {{[[Template:unblock|unblock]]}} template.',
explanation = 'If you cannot edit this user talk page and you need to'
.. ' make a change or leave a message, you can'
.. ' [[Wikipedia:Requests for page protection'
.. '#Current requests for edits to a protected page'
.. '|request an edit]],'
.. ' [[Wikipedia:Requests for page protection'
.. '#Current requests for reduction in protection level'
.. '|request unprotection]],'
.. ' [[Special:Userlogin|log in]],'
.. ' or [[Special:UserLogin/signup|create an account]].',
},
vandalism = {
description = 'For pages protected against'
.. ' [[Wikipedia:Vandalism|vandalism]]',
text = '${INTROFRAGMENT} due to [[Wikipedia:Vandalism|vandalism]].',
explanation = function (protectionObj, args)
local ret = ''
if protectionObj.level == 'sysop' then
ret = ret .. "This protection is '''not''' an endorsement of the"
.. ' ${CURRENTVERSION}. '
end
return ret .. '${EXPLANATIONBLURB}'
end,
tooltip = '${TOOLTIPFRAGMENT} due to vandalism',
}
},
move = {
dispute = {
description = 'For pages protected against page moves due to'
.. ' disputes over the page title',
explanation = "This protection is '''not''' an endorsement of the"
.. ' ${CURRENTVERSION}. ${EXPLANATIONBLURB}',
image = 'Move-protection-shackle.svg'
},
vandalism = {
description = 'For pages protected against'
.. ' [[Wikipedia:Vandalism#Page-move vandalism'
.. ' |page-move vandalism]]'
}
},
autoreview = {},
upload = {}
},
--------------------------------------------------------------------------------
--
-- GENERAL DATA TABLES
--
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- Protection blurbs
--------------------------------------------------------------------------------
-- This table produces the protection blurbs available with the
-- ${PROTECTIONBLURB} parameter. It is sorted by protection action and
-- protection level, and is checked by the module in the following order:
-- 1. page's protection action, page's protection level
-- 2. page's protection action, default protection level
-- 3. "edit" protection action, default protection level
--
-- It is possible to use banner parameters inside this table.
-- *required* - this table needs edit, move, autoreview and upload subtables.
protectionBlurbs = {
edit = {
default = 'This ${PAGETYPE} is currently [[Help:Protection|'
.. 'protected]] from editing',
autoconfirmed = 'Editing of this ${PAGETYPE} by [[Wikipedia:User access'
.. ' levels#New users|new]] or [[Wikipedia:User access levels#Unregistered'
.. ' users|unregistered]] users is currently [[Help:Protection|disabled]]',
extendedconfirmed = 'This ${PAGETYPE} is currently under extended confirmed protection',
},
move = {
default = 'This ${PAGETYPE} is currently [[Help:Protection|protected]]'
.. ' from [[Help:Moving a page|page moves]]'
},
autoreview = {
default = 'All edits made to this ${PAGETYPE} by'
.. ' [[Wikipedia:User access levels#New users|new]] or'
.. ' [[Wikipedia:User access levels#Unregistered users|unregistered]]'
.. ' users are currently'
.. ' [[Wikipedia:Pending changes|subject to review]]'
},
upload = {
default = 'Uploading new versions of this ${PAGETYPE} is currently disabled'
}
},
--------------------------------------------------------------------------------
-- Explanation blurbs
--------------------------------------------------------------------------------
-- This table produces the explanation blurbs available with the
-- ${EXPLANATIONBLURB} parameter. It is sorted by protection action,
-- protection level, and whether the page is a talk page or not. If the page is
-- a talk page it will have a talk key of "talk"; otherwise it will have a talk
-- key of "subject". The table is checked in the following order:
-- 1. page's protection action, page's protection level, page's talk key
-- 2. page's protection action, page's protection level, default talk key
-- 3. page's protection action, default protection level, page's talk key
-- 4. page's protection action, default protection level, default talk key
--
-- It is possible to use banner parameters inside this table.
-- *required* - this table needs edit, move, autoreview and upload subtables.
explanationBlurbs = {
edit = {
autoconfirmed = {
subject = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details. If you'
.. ' cannot edit this ${PAGETYPE} and you wish to make a change, you can'
.. ' ${EDITREQUEST}, discuss changes on the ${TALKPAGE},'
.. ' [[Wikipedia:Requests for page protection'
.. '#Current requests for reduction in protection level'
.. '|request unprotection]], [[Special:Userlogin|log in]], or'
.. ' [[Special:UserLogin/signup|create an account]].',
default = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details. If you'
.. ' cannot edit this ${PAGETYPE} and you wish to make a change, you can'
.. ' [[Wikipedia:Requests for page protection'
.. '#Current requests for reduction in protection level'
.. '|request unprotection]], [[Special:Userlogin|log in]], or'
.. ' [[Special:UserLogin/signup|create an account]].',
},
extendedconfirmed = {
default = 'Extended confirmed protection prevents edits from all unregistered editors'
.. ' and registered users with fewer than 30 days tenure and 500 edits.'
.. ' The [[Wikipedia:Protection policy#extended|policy on community use]]'
.. ' specifies that extended confirmed protection can be applied to combat'
.. ' disruption, if semi-protection has proven to be ineffective.'
.. ' Extended confirmed protection may also be applied to enforce'
.. ' [[Wikipedia:Arbitration Committee|arbitration sanctions]].'
.. ' Please discuss any changes on the ${TALKPAGE}; you may'
.. ' ${EDITREQUEST} to ask for uncontroversial changes supported by'
.. ' [[Wikipedia:Consensus|consensus]].'
},
default = {
subject = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' Please discuss any changes on the ${TALKPAGE}; you'
.. ' may ${EDITREQUEST} to ask an'
.. ' [[Wikipedia:Administrators|administrator]] to make an edit if it'
.. ' is [[Help:Minor edit#When to mark an edit as a minor edit'
.. '|uncontroversial]] or supported by [[Wikipedia:Consensus'
.. '|consensus]]. You may also [[Wikipedia:Requests for'
.. ' page protection#Current requests for reduction in protection level'
.. '|request]] that this page be unprotected.',
default = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' You may [[Wikipedia:Requests for page'
.. ' protection#Current requests for edits to a protected page|request an'
.. ' edit]] to this page, or [[Wikipedia:Requests for'
.. ' page protection#Current requests for reduction in protection level'
.. '|ask]] for it to be unprotected.'
}
},
move = {
default = {
subject = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' The page may still be edited but cannot be moved'
.. ' until unprotected. Please discuss any suggested moves on the'
.. ' ${TALKPAGE} or at [[Wikipedia:Requested moves]]. You can also'
.. ' [[Wikipedia:Requests for page protection|request]] that the page be'
.. ' unprotected.',
default = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' The page may still be edited but cannot be moved'
.. ' until unprotected. Please discuss any suggested moves at'
.. ' [[Wikipedia:Requested moves]]. You can also'
.. ' [[Wikipedia:Requests for page protection|request]] that the page be'
.. ' unprotected.'
}
},
autoreview = {
default = {
default = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' Edits to this ${PAGETYPE} by new and unregistered users'
.. ' will not be visible to readers until they are accepted by'
.. ' a reviewer. To avoid the need for your edits to be'
.. ' reviewed, you may'
.. ' [[Wikipedia:Requests for page protection'
.. '#Current requests for reduction in protection level'
.. '|request unprotection]], [[Special:Userlogin|log in]], or'
.. ' [[Special:UserLogin/signup|create an account]].'
},
},
upload = {
default = {
default = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' The page may still be edited but new versions of the file'
.. ' cannot be uploaded until it is unprotected. You can'
.. ' request that a new version be uploaded by using a'
.. ' [[Wikipedia:Edit requests|protected edit request]], or you'
.. ' can [[Wikipedia:Requests for page protection|request]]'
.. ' that the file be unprotected.'
}
}
},
--------------------------------------------------------------------------------
-- Protection levels
--------------------------------------------------------------------------------
-- This table provides the data for the ${PROTECTIONLEVEL} parameter, which
-- produces a short label for different protection levels. It is sorted by
-- protection action and protection level, and is checked in the following
-- order:
-- 1. page's protection action, page's protection level
-- 2. page's protection action, default protection level
-- 3. "edit" protection action, default protection level
--
-- It is possible to use banner parameters inside this table.
-- *required* - this table needs edit, move, autoreview and upload subtables.
protectionLevels = {
edit = {
default = 'protected',
templateeditor = 'template-protected',
extendedconfirmed = 'extended-protected',
autoconfirmed = 'semi-protected',
},
move = {
default = 'move-protected'
},
autoreview = {
},
upload = {
default = 'upload-protected'
}
},
--------------------------------------------------------------------------------
-- Images
--------------------------------------------------------------------------------
-- This table lists different padlock images for each protection action and
-- protection level. It is used if an image is not specified in any of the
-- banner data tables, and if the page does not satisfy the conditions for using
-- the ['image-filename-indef'] image. It is checked in the following order:
-- 1. page's protection action, page's protection level
-- 2. page's protection action, default protection level
images = {
edit = {
default = 'Full-protection-shackle.svg',
templateeditor = 'Template-protection-shackle.svg',
extendedconfirmed = 'Extended-protection-shackle.svg',
autoconfirmed = 'Semi-protection-shackle.svg'
},
move = {
default = 'Move-protection-shackle.svg',
},
autoreview = {
default = 'Pending-protection-shackle.svg'
},
upload = {
default = 'Upload-protection-shackle.svg'
}
},
-- Pages with a reason specified in this table will show the special "indef"
-- padlock, defined in the 'image-filename-indef' message, if no expiry is set.
indefImageReasons = {
template = true
},
--------------------------------------------------------------------------------
-- Image links
--------------------------------------------------------------------------------
-- This table provides the data for the ${IMAGELINK} parameter, which gets
-- the image link for small padlock icons based on the page's protection action
-- and protection level. It is checked in the following order:
-- 1. page's protection action, page's protection level
-- 2. page's protection action, default protection level
-- 3. "edit" protection action, default protection level
--
-- It is possible to use banner parameters inside this table.
-- *required* - this table needs edit, move, autoreview and upload subtables.
imageLinks = {
edit = {
default = 'Wikipedia:Protection policy#full',
templateeditor = 'Wikipedia:Protection policy#template',
extendedconfirmed = 'Wikipedia:Protection policy#extended',
autoconfirmed = 'Wikipedia:Protection policy#semi'
},
move = {
default = 'Wikipedia:Protection policy#move'
},
autoreview = {
default = 'Wikipedia:Protection policy#pending'
},
upload = {
default = 'Wikipedia:Protection policy#upload'
}
},
--------------------------------------------------------------------------------
-- Padlock indicator names
--------------------------------------------------------------------------------
-- This table provides the "name" attribute for the <indicator> extension tag
-- with which small padlock icons are generated. All indicator tags on a page
-- are displayed in alphabetical order based on this attribute, and with
-- indicator tags with duplicate names, the last tag on the page wins.
-- The attribute is chosen based on the protection action; table keys must be a
-- protection action name or the string "default".
padlockIndicatorNames = {
autoreview = 'pp-autoreview',
default = 'pp-default'
},
--------------------------------------------------------------------------------
-- Protection categories
--------------------------------------------------------------------------------
--[[
-- The protection categories are stored in the protectionCategories table.
-- Keys to this table are made up of the following strings:
--
-- 1. the expiry date
-- 2. the namespace
-- 3. the protection reason (e.g. "dispute" or "vandalism")
-- 4. the protection level (e.g. "sysop" or "autoconfirmed")
-- 5. the action (e.g. "edit" or "move")
--
-- When the module looks up a category in the table, first it will will check to
-- see a key exists that corresponds to all five parameters. For example, a
-- user page semi-protected from vandalism for two weeks would have the key
-- "temp-user-vandalism-autoconfirmed-edit". If no match is found, the module
-- changes the first part of the key to "all" and checks the table again. It
-- keeps checking increasingly generic key combinations until it finds the
-- field, or until it reaches the key "all-all-all-all-all".
--
-- The module uses a binary matrix to determine the order in which to search.
-- This is best demonstrated by a table. In this table, the "0" values
-- represent "all", and the "1" values represent the original data (e.g.
-- "indef" or "file" or "vandalism").
--
-- expiry namespace reason level action
-- order
-- 1 1 1 1 1 1
-- 2 0 1 1 1 1
-- 3 1 0 1 1 1
-- 4 0 0 1 1 1
-- 5 1 1 0 1 1
-- 6 0 1 0 1 1
-- 7 1 0 0 1 1
-- 8 0 0 0 1 1
-- 9 1 1 1 0 1
-- 10 0 1 1 0 1
-- 11 1 0 1 0 1
-- 12 0 0 1 0 1
-- 13 1 1 0 0 1
-- 14 0 1 0 0 1
-- 15 1 0 0 0 1
-- 16 0 0 0 0 1
-- 17 1 1 1 1 0
-- 18 0 1 1 1 0
-- 19 1 0 1 1 0
-- 20 0 0 1 1 0
-- 21 1 1 0 1 0
-- 22 0 1 0 1 0
-- 23 1 0 0 1 0
-- 24 0 0 0 1 0
-- 25 1 1 1 0 0
-- 26 0 1 1 0 0
-- 27 1 0 1 0 0
-- 28 0 0 1 0 0
-- 29 1 1 0 0 0
-- 30 0 1 0 0 0
-- 31 1 0 0 0 0
-- 32 0 0 0 0 0
--
-- In this scheme the action has the highest priority, as it is the last
-- to change, and the expiry has the least priority, as it changes the most.
-- The priorities of the expiry, the protection level and the action are
-- fixed, but the priorities of the reason and the namespace can be swapped
-- through the use of the cfg.bannerDataNamespaceHasPriority table.
--]]
-- If the reason specified to the template is listed in this table,
-- namespace data will take priority over reason data in the protectionCategories
-- table.
reasonsWithNamespacePriority = {
vandalism = true,
},
-- The string to use as a namespace key for the protectionCategories table for each
-- namespace number.
categoryNamespaceKeys = {
[ 2] = 'user',
[ 3] = 'user',
[ 4] = 'project',
[ 6] = 'file',
[ 8] = 'mediawiki',
[ 10] = 'template',
[ 12] = 'project',
[ 14] = 'category',
[100] = 'portal',
[828] = 'module',
},
protectionCategories = {
['all|all|all|all|all'] = 'Wikipedia fully protected pages',
['all|all|office|all|all'] = 'Wikipedia Office-protected pages',
['all|all|reset|all|all'] = 'Wikipedia Office-protected pages',
['all|all|dmca|all|all'] = 'Wikipedia Office-protected pages',
['all|all|mainpage|all|all'] = 'Wikipedia fully protected main page files',
['all|all|all|extendedconfirmed|all'] = 'Wikipedia extended-confirmed-protected pages',
['all|all|ecp|extendedconfirmed|all'] = 'Wikipedia extended-confirmed-protected pages',
['all|template|all|all|edit'] = 'Wikipedia fully protected templates',
['all|all|all|autoconfirmed|edit'] = 'Wikipedia semi-protected pages',
['indef|all|all|autoconfirmed|edit'] = 'Wikipedia indefinitely semi-protected pages',
['all|all|blp|autoconfirmed|edit'] = 'Wikipedia indefinitely semi-protected biographies of living people',
['temp|all|blp|autoconfirmed|edit'] = 'Wikipedia temporarily semi-protected biographies of living people',
['all|all|dispute|autoconfirmed|edit'] = 'Wikipedia pages semi-protected due to dispute',
['all|all|sock|autoconfirmed|edit'] = 'Wikipedia pages semi-protected from banned users',
['all|all|vandalism|autoconfirmed|edit'] = 'Wikipedia pages semi-protected against vandalism',
['all|category|all|autoconfirmed|edit'] = 'Wikipedia semi-protected categories',
['all|file|all|autoconfirmed|edit'] = 'Wikipedia semi-protected files',
['all|portal|all|autoconfirmed|edit'] = 'Wikipedia semi-protected portals',
['all|project|all|autoconfirmed|edit'] = 'Wikipedia semi-protected project pages',
['all|talk|all|autoconfirmed|edit'] = 'Wikipedia semi-protected talk pages',
['all|template|all|autoconfirmed|edit'] = 'Wikipedia semi-protected templates',
['all|user|all|autoconfirmed|edit'] = 'Wikipedia semi-protected user and user talk pages',
['all|all|all|templateeditor|move'] = 'Wikipedia template-protected pages other than templates and modules',
['all|all|all|templateeditor|edit'] = 'Wikipedia template-protected pages other than templates and modules',
['all|template|all|templateeditor|edit'] = 'Wikipedia template-protected templates',
['all|template|all|templateeditor|move'] = 'Wikipedia template-protected templates', -- move-protected templates
['all|all|blp|sysop|edit'] = 'Wikipedia indefinitely protected biographies of living people',
['temp|all|blp|sysop|edit'] = 'Wikipedia temporarily protected biographies of living people',
['all|all|dispute|sysop|edit'] = 'Wikipedia pages protected due to dispute',
['all|all|sock|sysop|edit'] = 'Wikipedia pages protected from banned users',
['all|all|vandalism|sysop|edit'] = 'Wikipedia pages protected against vandalism',
['all|category|all|sysop|edit'] = 'Wikipedia fully protected categories',
['all|file|all|sysop|edit'] = 'Wikipedia fully protected files',
['all|project|all|sysop|edit'] = 'Wikipedia fully protected project pages',
['all|talk|all|sysop|edit'] = 'Wikipedia fully protected talk pages',
['all|template|all|extendedconfirmed|edit'] = 'Wikipedia extended-confirmed-protected templates',
['all|template|all|sysop|edit'] = 'Wikipedia fully protected templates',
['all|user|all|sysop|edit'] = 'Wikipedia fully protected user and user talk pages',
['all|module|all|all|edit'] = 'Wikipedia fully protected modules',
['all|module|all|templateeditor|edit'] = 'Wikipedia template-protected modules',
['all|module|all|extendedconfirmed|edit'] = 'Wikipedia extended-confirmed-protected modules',
['all|module|all|autoconfirmed|edit'] = 'Wikipedia semi-protected modules',
['all|all|all|sysop|move'] = 'Wikipedia move-protected pages',
['indef|all|all|sysop|move'] = 'Wikipedia indefinitely move-protected pages',
['all|all|dispute|sysop|move'] = 'Wikipedia pages move-protected due to dispute',
['all|all|vandalism|sysop|move'] = 'Wikipedia pages move-protected due to vandalism',
['all|portal|all|sysop|move'] = 'Wikipedia move-protected portals',
['all|project|all|sysop|move'] = 'Wikipedia move-protected project pages',
['all|talk|all|sysop|move'] = 'Wikipedia move-protected talk pages',
['all|template|all|sysop|move'] = 'Wikipedia move-protected templates',
['all|user|all|sysop|move'] = 'Wikipedia move-protected user and user talk pages',
['all|all|all|autoconfirmed|autoreview'] = 'Wikipedia pending changes protected pages',
['all|file|all|all|upload'] = 'Wikipedia upload-protected files',
},
--------------------------------------------------------------------------------
-- Expiry category config
--------------------------------------------------------------------------------
-- This table configures the expiry category behaviour for each protection
-- action.
-- * If set to true, setting that action will always categorise the page if
-- an expiry parameter is not set.
-- * If set to false, setting that action will never categorise the page.
-- * If set to nil, the module will categorise the page if:
-- 1) an expiry parameter is not set, and
-- 2) a reason is provided, and
-- 3) the specified reason is not blacklisted in the reasonsWithoutExpiryCheck
-- table.
expiryCheckActions = {
edit = nil,
move = false,
autoreview = true,
upload = false
},
reasonsWithoutExpiryCheck = {
blp = true,
template = true,
},
--------------------------------------------------------------------------------
-- Pagetypes
--------------------------------------------------------------------------------
-- This table produces the page types available with the ${PAGETYPE} parameter.
-- Keys are namespace numbers, or the string "default" for the default value.
pagetypes = {
[0] = 'article',
[6] = 'file',
[10] = 'template',
[14] = 'category',
[828] = 'module',
default = 'page'
},
--------------------------------------------------------------------------------
-- Strings marking indefinite protection
--------------------------------------------------------------------------------
-- This table contains values passed to the expiry parameter that mean the page
-- is protected indefinitely.
indefStrings = {
['indef'] = true,
['indefinite'] = true,
['indefinitely'] = true,
['infinite'] = true,
},
--------------------------------------------------------------------------------
-- Group hierarchy
--------------------------------------------------------------------------------
-- This table maps each group to all groups that have a superset of the original
-- group's page editing permissions.
hierarchy = {
sysop = {},
reviewer = {'sysop'},
filemover = {'sysop'},
templateeditor = {'sysop'},
extendedconfirmed = {'sysop'},
autoconfirmed = {'reviewer', 'filemover', 'templateeditor', 'extendedconfirmed'},
user = {'autoconfirmed'},
['*'] = {'user'}
},
--------------------------------------------------------------------------------
-- Wrapper templates and their default arguments
--------------------------------------------------------------------------------
-- This table contains wrapper templates used with the module, and their
-- default arguments. Templates specified in this table should contain the
-- following invocation, and no other template content:
--
-- {{#invoke:Protection banner|main}}
--
-- If other content is desired, it can be added between
-- <noinclude>...</noinclude> tags.
--
-- When a user calls one of these wrapper templates, they will use the
-- default arguments automatically. However, users can override any of the
-- arguments.
wrappers = {
['Template:Pp'] = {},
['Template:Pp-extended'] = {'ecp'},
['Template:Pp-blp'] = {'blp'},
-- we don't need Template:Pp-create
['Template:Pp-dispute'] = {'dispute'},
['Template:Pp-main-page'] = {'mainpage'},
['Template:Pp-move'] = {action = 'move', catonly = 'yes'},
['Template:Pp-move-dispute'] = {'dispute', action = 'move', catonly = 'yes'},
-- we don't need Template:Pp-move-indef
['Template:Pp-move-vandalism'] = {'vandalism', action = 'move', catonly = 'yes'},
['Template:Pp-office'] = {'office'},
['Template:Pp-office-dmca'] = {'dmca'},
['Template:Pp-pc'] = {action = 'autoreview', small = true},
['Template:Pp-pc1'] = {action = 'autoreview', small = true},
['Template:Pp-reset'] = {'reset'},
['Template:Pp-semi-indef'] = {small = true},
['Template:Pp-sock'] = {'sock'},
['Template:Pp-template'] = {'template', small = true},
['Template:Pp-upload'] = {action = 'upload'},
['Template:Pp-usertalk'] = {'usertalk'},
['Template:Pp-vandalism'] = {'vandalism'},
},
--------------------------------------------------------------------------------
--
-- MESSAGES
--
--------------------------------------------------------------------------------
msg = {
--------------------------------------------------------------------------------
-- Intro blurb and intro fragment
--------------------------------------------------------------------------------
-- These messages specify what is produced by the ${INTROBLURB} and
-- ${INTROFRAGMENT} parameters. If the protection is temporary they use the
-- intro-blurb-expiry or intro-fragment-expiry, and if not they use
-- intro-blurb-noexpiry or intro-fragment-noexpiry.
-- It is possible to use banner parameters in these messages.
['intro-blurb-expiry'] = '${PROTECTIONBLURB} until ${EXPIRY}.',
['intro-blurb-noexpiry'] = '${PROTECTIONBLURB}.',
['intro-fragment-expiry'] = '${PROTECTIONBLURB} until ${EXPIRY},',
['intro-fragment-noexpiry'] = '${PROTECTIONBLURB}',
--------------------------------------------------------------------------------
-- Tooltip blurb
--------------------------------------------------------------------------------
-- These messages specify what is produced by the ${TOOLTIPBLURB} parameter.
-- If the protection is temporary the tooltip-blurb-expiry message is used, and
-- if not the tooltip-blurb-noexpiry message is used.
-- It is possible to use banner parameters in these messages.
['tooltip-blurb-expiry'] = 'This ${PAGETYPE} is ${PROTECTIONLEVEL} until ${EXPIRY}.',
['tooltip-blurb-noexpiry'] = 'This ${PAGETYPE} is ${PROTECTIONLEVEL}.',
['tooltip-fragment-expiry'] = 'This ${PAGETYPE} is ${PROTECTIONLEVEL} until ${EXPIRY},',
['tooltip-fragment-noexpiry'] = 'This ${PAGETYPE} is ${PROTECTIONLEVEL}',
--------------------------------------------------------------------------------
-- Special explanation blurb
--------------------------------------------------------------------------------
-- An explanation blurb for pages that cannot be unprotected, e.g. for pages
-- in the MediaWiki namespace.
-- It is possible to use banner parameters in this message.
['explanation-blurb-nounprotect'] = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' Please discuss any changes on the ${TALKPAGE}; you'
.. ' may ${EDITREQUEST} to ask an'
.. ' [[Wikipedia:Administrators|administrator]] to make an edit if it'
.. ' is [[Help:Minor edit#When to mark an edit as a minor edit'
.. '|uncontroversial]] or supported by [[Wikipedia:Consensus'
.. '|consensus]].',
--------------------------------------------------------------------------------
-- Protection log display values
--------------------------------------------------------------------------------
-- These messages determine the display values for the protection log link
-- or the pending changes log link produced by the ${PROTECTIONLOG} parameter.
-- It is possible to use banner parameters in these messages.
['protection-log-display'] = 'protection log',
['pc-log-display'] = 'pending changes log',
--------------------------------------------------------------------------------
-- Current version display values
--------------------------------------------------------------------------------
-- These messages determine the display values for the page history link
-- or the move log link produced by the ${CURRENTVERSION} parameter.
-- It is possible to use banner parameters in these messages.
['current-version-move-display'] = 'current title',
['current-version-edit-display'] = 'current version',
--------------------------------------------------------------------------------
-- Talk page
--------------------------------------------------------------------------------
-- This message determines the display value of the talk page link produced
-- with the ${TALKPAGE} parameter.
-- It is possible to use banner parameters in this message.
['talk-page-link-display'] = 'talk page',
--------------------------------------------------------------------------------
-- Edit requests
--------------------------------------------------------------------------------
-- This message determines the display value of the edit request link produced
-- with the ${EDITREQUEST} parameter.
-- It is possible to use banner parameters in this message.
['edit-request-display'] = 'submit an edit request',
--------------------------------------------------------------------------------
-- Expiry date format
--------------------------------------------------------------------------------
-- This is the format for the blurb expiry date. It should be valid input for
-- the first parameter of the #time parser function.
['expiry-date-format'] = 'F j, Y "at" H:i e',
--------------------------------------------------------------------------------
-- Tracking categories
--------------------------------------------------------------------------------
-- These messages determine which tracking categories the module outputs.
['tracking-category-incorrect'] = 'Wikipedia pages with incorrect protection templates',
['tracking-category-template'] = 'Wikipedia template-protected pages other than templates and modules',
--------------------------------------------------------------------------------
-- Images
--------------------------------------------------------------------------------
-- These are images that are not defined by their protection action and protection level.
['image-filename-indef'] = 'Full-protection-shackle.svg',
['image-filename-default'] = 'Transparent.gif',
--------------------------------------------------------------------------------
-- End messages
--------------------------------------------------------------------------------
}
--------------------------------------------------------------------------------
-- End configuration
--------------------------------------------------------------------------------
}
65de905227752d0a0dae145e9ad8dbe1d0087016
Module:Documentation/styles.css
828
75
109
2024-03-20T03:28:32Z
wikipedia>Jdlrobson
0
Classes have been updated. More information on [[mw:Recommendations_for_night_mode_compatibility_on_Wikimedia_wikis]]
sanitized-css
text/css
/* {{pp|small=yes}} */
.documentation,
.documentation-metadata {
border: 1px solid #a2a9b1;
background-color: #ecfcf4;
clear: both;
}
.documentation {
margin: 1em 0 0 0;
padding: 1em;
}
.documentation-metadata {
margin: 0.2em 0; /* same margin left-right as .documentation */
font-style: italic;
padding: 0.4em 1em; /* same padding left-right as .documentation */
}
.documentation-startbox {
padding-bottom: 3px;
border-bottom: 1px solid #aaa;
margin-bottom: 1ex;
}
.documentation-heading {
font-weight: bold;
font-size: 125%;
}
.documentation-clear { /* Don't want things to stick out where they shouldn't. */
clear: both;
}
.documentation-toolbar {
font-style: normal;
font-size: 85%;
}
html.skin-theme-clientpref-night .documentation,
html.skin-theme-clientpref-night .documentation-metadata {
background-color: inherit;
}
@media (prefers-color-scheme: dark) {
html.skin-theme-clientpref-os .documentation,
html.skin-theme-clientpref-os .documentation-metadata {
background-color: inherit;
}
}
a086e12b14e61c1254b77cddf71625c15359e806
Main Page
0
1
1
2024-03-24T01:57:16Z
MediaWiki default
2
wikitext
text/x-wiki
<strong>MediaWiki has been installed.</strong>
Consult the [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents User's Guide] for information on using the wiki software.
== Getting started ==
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]
* [https://lists.wikimedia.org/postorius/lists/mediawiki-announce.lists.wikimedia.org/ MediaWiki release mailing list]
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki for your language]
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Learn how to combat spam on your wiki]
11cef88175cf81168a86e7c0327a5b2d7a1920f5
Vichthart
0
2
2
2024-03-24T02:14:04Z
Vicht
1
Created page with "<b><dfn>Father Vichthart Fezzilbahn</dfn></b>, affectionately called <b>Priestman</b> by [[Grokko]], is a member of clergy within [[Verein Kirche von Arkhelle]] and a priest of the goddess of redemption, [[Sarenrae]]. He is a relatively quiet and reserved man, tending to let actions occur around him, but years of travel, as well as recent events, have kept him a stalwart defender when travelling alone or with others. Although he isn't a confident conversationalist, he is..."
wikitext
text/x-wiki
<b><dfn>Father Vichthart Fezzilbahn</dfn></b>, affectionately called <b>Priestman</b> by [[Grokko]], is a member of clergy within [[Verein Kirche von Arkhelle]] and a priest of the goddess of redemption, [[Sarenrae]]. He is a relatively quiet and reserved man, tending to let actions occur around him, but years of travel, as well as recent events, have kept him a stalwart defender when travelling alone or with others. Although he isn't a confident conversationalist, he is a fastidious keeper of notes that he keeps to present to his highers up within the church, and given time he can prepare a competent speech and deliver it with enthusiasm.
Normally Vichthart, or just Vicht, lives at home with his wife—[[Anastel]]—and their three children in a quaint village where he is the local priest, delivering sermons and supporting the spiritual and personal lives of his parishioners. However, he annually travels around the western end of the [[Roughspun Coast]] in order to audit the records of tithes collected by churches in that area. He has grown familiar with the priests along his route, including [[Father Traulam Eugen]] in [[Senneborn]], and he enjoys meeting other individuals on his annual trip. Years of solo travel have accustomed him to tackling the occasional thug, [[goblin]] or wild animal on the road.
On his most recent trip to [[Scharn]], Vichthart was travelling on <i class="ship">[[The Crested Eagle]]</i> when it sank off the coast near [[Meeresdorf]]. A word from Sarenrare though helped him to survive and swim to shore along with Grokko, [[Kenneth]] and the unconscious [[Lania Falst]]. Learning from the harbourmaster [[Solomon Dugraf]] that all ships off this coast have mysteriously sunk in inexplicable storms, Vicht and his companions are thrust into the responsibility of defending [[Western Scharn]] from an incursion of [[demon]]-worshipping [[gnoll]]s led by [[Srir Silthallow]] and [[Rrekkeh Stormcrawler]]. After closing their portal on a small, forgotten island, instead of being able to continue his regular duties or return home, Vichthart was summoned to [[Kaarst]] to provide outside assistance in the investigation of a string of murders and disappearances. Taking Grokko and [[Kham]] with him, and teaming up with newcomer to the empire [[Mira]], they uncovered and disrupted a conspiracy of mages plotting with [[devil]]s and [[vampire]]s to detonate heavy explosives underneath the city.
Vichthart is originally from [[Heldruh]], just north of the imperial capital [[Hellenhelm]], but studied to become a priest in [[Baumeln]], a town on the border of [[Arkhelle]], Scharn and [[Denkrei]]. He stays overnight in Kaarst every year at the start of his rounds, staying at [[The Copper Roost]], although he doesn't enjoy the noise and bustle of cities, nor the idiosyncratic laws and clergy of Kaarst. Nevertheless, while he waits for his friends to find him in the city, he manages to drink enough to become slightly merry. He has only occasionally reached the limits of his patience, being incensed at the theft of the [[platinum gauntlet]] holy relic from the [[Church of St Anorad]], and throwing one gnoll off a bridge in a rage after first encountering the demons they'd summoned.
Vichthart is loyal to Verein Kirche von Arkhelle, reporting to [[Father Eivald Glissan]] at <abbr title="Holy Quorum">[[HQ]]</abbr> regularly, keeping extensive notes to hand in to Hellenhelm, and being excited to meet [[Cardinal Maurul Silkendawn]]. Although he has listened patiently to [[Reiner Hoss]] outline his hatred of [[Kade Sirrine Kathedrale]] for its treatment of those who worship [[Mystra]], he remains steadfast in his resolve to protect the church, placing his trust in [[Sable Warden Meriele Berevan]] and her hatred of the undead to confide their findings to her, despite their suspicion that there might be insiders within the clergy. He tells Kham that there are no grounds for him to assassinate Cardinal Silkendawn, no matter what cooperation it gets them from [[Leagallow Tiaathque]] in the short term.
Vichthart is also devoted to his goddess, Sarenrae, praying to her every morning. He has very occasionally received words of advice from her via his holy pendant, being told to swim when first falling in the cold waters off Meeresdorf, and recently being guided to put the [[Feywild Shard]] in the hands of Grokko. He was pleased to see Lania Falst wearing a pendant similar to his own after she recovered in Meeresdorf, and has been keenly watching Grokko's growing interest in the church, disappointed by how readily he's changed his attitude after speaking to members of the [[Knives of Mystra]]. Early on in his adventures in Scharn, he experienced a dream of his father, [[Father Decheimül Fezzilbahn]], in the form of an early lesson he received about the duality of Sarenrae, and the very real fight against evil being just as important as the protection and redemption of good people.
Vichthart's eagerness to serve the church, to purge the world of fiendish invaders, and protect his friends, can sometimes cause him to fight with reckless regard for his own well being. His use of his shield and mace, and tendency to try to grapple and pin his opponents, result in his ending up close to danger multiple times. When first attacking a goblin hideout near Meeresdorf, Vichthart neared death at the hands of the [[bugbear]] [[Tark]], receiving a permanent, sun-shaped scar on his chest. His acquisition of [[platinum ring]]s from [[faerie dragon]]s has encouraged him to take even more damage by regularly casting [[Warding Bond]] on Grokko. Fortunately, his discovery and wearing of the [[Periapt of Wound Closure]] has saved his life on every occasion, but falling unconscious so often has frequently left him unable to fight, to flee dangerous situations, or heal his friends when needed. While facing the Knives of Mystra underneath Kaarst, he needed to be administered a [[Potion of Healing]] twice by the [[Raven Guard]] nicknamed [[Black]].
Vichthart has twice been infected by disease, firstly taking a swipe from a gnoll that gave him an uncanny cackle, and later breathing in fungal spores from a [[false beholder]] beneath [[Squall's Beacon]]. In both cases, Vichthart brushed aside concerns for his wellbeing, and although his cackling subsided on its own, it was only when Kham used his [[Lay On Hands]] that Vichthart coughed up the horrible clump that had been growing inside him that they realized how perilous his infection had been.
[[Category:Heroes]]
[[Category:Clerics]]
[[Category:Members of Verein Kirche von Arkhelle]]
[[Category:Worshippers of Sarenrae]]
[[Category:Fezzilbahn family]]
f922c7932e7b6dedaa7de08eead0b6c7419feb39
10
2
2024-03-24T17:48:27Z
Vicht
1
Added to Category:Characters_played_by_Wil
wikitext
text/x-wiki
<b><dfn>Father Vichthart Fezzilbahn</dfn></b>, affectionately called <b>Priestman</b> by [[Grokko]], is a member of clergy within [[Verein Kirche von Arkhelle]] and a priest of the goddess of redemption, [[Sarenrae]]. He is a relatively quiet and reserved man, tending to let actions occur around him, but years of travel, as well as recent events, have kept him a stalwart defender when travelling alone or with others. Although he isn't a confident conversationalist, he is a fastidious keeper of notes that he keeps to present to his highers up within the church, and given time he can prepare a competent speech and deliver it with enthusiasm.
Normally Vichthart, or just Vicht, lives at home with his wife—[[Anastel]]—and their three children in a quaint village where he is the local priest, delivering sermons and supporting the spiritual and personal lives of his parishioners. However, he annually travels around the western end of the [[Roughspun Coast]] in order to audit the records of tithes collected by churches in that area. He has grown familiar with the priests along his route, including [[Father Traulam Eugen]] in [[Senneborn]], and he enjoys meeting other individuals on his annual trip. Years of solo travel have accustomed him to tackling the occasional thug, [[goblin]] or wild animal on the road.
On his most recent trip to [[Scharn]], Vichthart was travelling on <i class="ship">[[The Crested Eagle]]</i> when it sank off the coast near [[Meeresdorf]]. A word from Sarenrare though helped him to survive and swim to shore along with Grokko, [[Kenneth]] and the unconscious [[Lania Falst]]. Learning from the harbourmaster [[Solomon Dugraf]] that all ships off this coast have mysteriously sunk in inexplicable storms, Vicht and his companions are thrust into the responsibility of defending [[Western Scharn]] from an incursion of [[demon]]-worshipping [[gnoll]]s led by [[Srir Silthallow]] and [[Rrekkeh Stormcrawler]]. After closing their portal on a small, forgotten island, instead of being able to continue his regular duties or return home, Vichthart was summoned to [[Kaarst]] to provide outside assistance in the investigation of a string of murders and disappearances. Taking Grokko and [[Kham]] with him, and teaming up with newcomer to the empire [[Mira]], they uncovered and disrupted a conspiracy of mages plotting with [[devil]]s and [[vampire]]s to detonate heavy explosives underneath the city.
Vichthart is originally from [[Heldruh]], just north of the imperial capital [[Hellenhelm]], but studied to become a priest in [[Baumeln]], a town on the border of [[Arkhelle]], Scharn and [[Denkrei]]. He stays overnight in Kaarst every year at the start of his rounds, staying at [[The Copper Roost]], although he doesn't enjoy the noise and bustle of cities, nor the idiosyncratic laws and clergy of Kaarst. Nevertheless, while he waits for his friends to find him in the city, he manages to drink enough to become slightly merry. He has only occasionally reached the limits of his patience, being incensed at the theft of the [[platinum gauntlet]] holy relic from the [[Church of St Anorad]], and throwing one gnoll off a bridge in a rage after first encountering the demons they'd summoned.
Vichthart is loyal to Verein Kirche von Arkhelle, reporting to [[Father Eivald Glissan]] at <abbr title="Holy Quorum">[[HQ]]</abbr> regularly, keeping extensive notes to hand in to Hellenhelm, and being excited to meet [[Cardinal Maurul Silkendawn]]. Although he has listened patiently to [[Reiner Hoss]] outline his hatred of [[Kade Sirrine Kathedrale]] for its treatment of those who worship [[Mystra]], he remains steadfast in his resolve to protect the church, placing his trust in [[Sable Warden Meriele Berevan]] and her hatred of the undead to confide their findings to her, despite their suspicion that there might be insiders within the clergy. He tells Kham that there are no grounds for him to assassinate Cardinal Silkendawn, no matter what cooperation it gets them from [[Leagallow Tiaathque]] in the short term.
Vichthart is also devoted to his goddess, Sarenrae, praying to her every morning. He has very occasionally received words of advice from her via his holy pendant, being told to swim when first falling in the cold waters off Meeresdorf, and recently being guided to put the [[Feywild Shard]] in the hands of Grokko. He was pleased to see Lania Falst wearing a pendant similar to his own after she recovered in Meeresdorf, and has been keenly watching Grokko's growing interest in the church, disappointed by how readily he's changed his attitude after speaking to members of the [[Knives of Mystra]]. Early on in his adventures in Scharn, he experienced a dream of his father, [[Father Decheimül Fezzilbahn]], in the form of an early lesson he received about the duality of Sarenrae, and the very real fight against evil being just as important as the protection and redemption of good people.
Vichthart's eagerness to serve the church, to purge the world of fiendish invaders, and protect his friends, can sometimes cause him to fight with reckless regard for his own well being. His use of his shield and mace, and tendency to try to grapple and pin his opponents, result in his ending up close to danger multiple times. When first attacking a goblin hideout near Meeresdorf, Vichthart neared death at the hands of the [[bugbear]] [[Tark]], receiving a permanent, sun-shaped scar on his chest. His acquisition of [[platinum ring]]s from [[faerie dragon]]s has encouraged him to take even more damage by regularly casting [[Warding Bond]] on Grokko. Fortunately, his discovery and wearing of the [[Periapt of Wound Closure]] has saved his life on every occasion, but falling unconscious so often has frequently left him unable to fight, to flee dangerous situations, or heal his friends when needed. While facing the Knives of Mystra underneath Kaarst, he needed to be administered a [[Potion of Healing]] twice by the [[Raven Guard]] nicknamed [[Black]].
Vichthart has twice been infected by disease, firstly taking a swipe from a gnoll that gave him an uncanny cackle, and later breathing in fungal spores from a [[false beholder]] beneath [[Squall's Beacon]]. In both cases, Vichthart brushed aside concerns for his wellbeing, and although his cackling subsided on its own, it was only when Kham used his [[Lay On Hands]] that Vichthart coughed up the horrible clump that had been growing inside him that they realized how perilous his infection had been.
[[Category:Heroes]]
[[Category:Clerics]]
[[Category:Members of Verein Kirche von Arkhelle]]
[[Category:Worshippers of Sarenrae]]
[[Category:Fezzilbahn family]]
[[Category:Characters played by Wil]]
09a7150cd22a713813d485a188eedb031de2efe1
Tark
0
3
3
2024-03-24T02:16:35Z
Vicht
1
Created page with "[[Bugbear]] running the cargo collection hideout near [[Meeresdorf]], whose attack with a mace knocks [[Vichthart]] unconscious and leaves a permanent sun-shaped scar on his chest. He is swiftly killed by [[Grokko]] and [[Kenneth]]. [[Droghen]] had written to Tark directly, threatening to replace him with [[Bezur]] if he messed up. [[Category:Bugbears]] [[Category:Underlings of Droghen]]"
wikitext
text/x-wiki
[[Bugbear]] running the cargo collection hideout near [[Meeresdorf]], whose attack with a mace knocks [[Vichthart]] unconscious and leaves a permanent sun-shaped scar on his chest. He is swiftly killed by [[Grokko]] and [[Kenneth]]. [[Droghen]] had written to Tark directly, threatening to replace him with [[Bezur]] if he messed up.
[[Category:Bugbears]]
[[Category:Underlings of Droghen]]
29b608ed3fb93357347ef3d5f2cb10e4ac337c9c
Module:Transclusion count/data/N
828
88
135
2024-03-24T05:15:45Z
wikipedia>Ahechtbot
0
[[Wikipedia:BOT|Bot]]: Updated page.
Scribunto
text/plain
return {
["N"] = 2700,
["N.b."] = 2000,
["N/A"] = 25000,
["N/a"] = 58000,
["NA-Class"] = 15000,
["NASCAR_next_race"] = 2000,
["NASTRO_comment"] = 31000,
["NBA_Draft_template_list"] = 3400,
["NBA_Year"] = 5700,
["NBA_color"] = 3600,
["NBA_color_cell"] = 4300,
["NBA_color_cell2"] = 3400,
["NBA_player_statistics_legend"] = 4700,
["NBA_player_statistics_start"] = 4000,
["NBbox"] = 3400,
["NCAA_color_cell"] = 11000,
["NCAA_secondary_color_cell"] = 4400,
["NCES_District_ID"] = 2700,
["NED"] = 9800,
["NEXTYEAR"] = 8000,
["NFLAltPrimaryStyle"] = 2300,
["NFLPrimaryStyle"] = 27000,
["NFLSecondaryColor"] = 18000,
["NFL_Roster_navbox_template_list"] = 2500,
["NFL_Year"] = 25000,
["NFL_predraft"] = 6900,
["NFL_predraft/check"] = 6900,
["NFL_predraft/ftin"] = 6900,
["NFLplayer"] = 2100,
["NFT"] = 7000,
["NFT_player"] = 31000,
["NGA"] = 3300,
["NGR"] = 2400,
["NHLE"] = 19000,
["NHLS_url"] = 2200,
["NLD"] = 11000,
["NLM_content"] = 2800,
["NOINDEX"] = 459000,
["NOMIS2011"] = 2300,
["NOR"] = 9600,
["NPG_name"] = 2100,
["NRDB_species"] = 7000,
["NRHP-PA"] = 2600,
["NRHPGoogleMapFootnote"] = 2500,
["NRHP_Focus"] = 73000,
["NRHP_color"] = 3700,
["NRHP_date_for_lists"] = 3100,
["NRHP_date_for_lists/dates"] = 3100,
["NRHP_header"] = 3400,
["NRHP_navigation_box"] = 8400,
["NRHP_row"] = 3400,
["NRHP_style"] = 70000,
["NRHP_url"] = 29000,
["NRHP_url/core"] = 31000,
["NRISref"] = 73000,
["NSWcity"] = 2100,
["NSWcity/core"] = 2100,
["NUMBEROFSECTIONS"] = 2100,
["NYCS_br"] = 2700,
["NYCS_time_2"] = 3100,
["NZL"] = 6800,
["NZ_electorate_link"] = 2500,
["Na"] = 2700,
["Nac"] = 3000,
["Namespace_detect"] = 572000,
["Namespace_detect_showall"] = 7200,
["Nastaliq"] = 11000,
["Nat_fs_end"] = 2500,
["National_Film_Awards/style"] = 2100,
["National_Heritage_List_for_England"] = 23000,
["National_Rail_style"] = 5800,
["National_Register_of_Historic_Places"] = 29000,
["National_Register_of_Historic_Places_in_Massachusetts"] = 4400,
["National_Register_of_Historic_Places_in_New_York"] = 5600,
["National_Register_of_Historic_Places_in_North_Carolina"] = 2900,
["National_Register_of_Historic_Places_in_Pennsylvania"] = 3200,
["National_Register_of_Historic_Places_in_Virginia"] = 3100,
["National_basketball_squad"] = 3200,
["National_field_hockey_squad"] = 4100,
["National_football_squad_end"] = 3000,
["National_football_squad_start/styles.css"] = 2400,
["National_rugby_union_team"] = 4500,
["National_squad"] = 42000,
["National_squad_no_numbers"] = 17000,
["National_volleyball_team"] = 2400,
["Native_name"] = 20000,
["Native_name_checker"] = 83000,
["Naval"] = 3800,
["Naval/core"] = 3800,
["Navbar"] = 39000,
["Navbar-collapsible"] = 3400,
["Navbar-header"] = 16000,
["Navbar-header/styles.css"] = 16000,
["Navbox"] = 2910000,
["Navbox_GR_munic"] = 3500,
["Navbox_Musical_artist"] = 9900,
["Navbox_bottom"] = 16000,
["Navbox_decade_list"] = 11000,
["Navbox_documentation"] = 35000,
["Navbox_ice_hockey"] = 3200,
["Navbox_musical_artist"] = 228000,
["Navbox_musical_artist/color"] = 228000,
["Navbox_rugby_league_squad"] = 5000,
["Navbox_season_by_team"] = 3200,
["Navbox_top"] = 16000,
["Navbox_visibility"] = 35000,
["Navbox_with_collapsible_groups"] = 137000,
["Navbox_with_collapsible_sections"] = 2400,
["Navbox_with_columns"] = 26000,
["Navboxes"] = 58000,
["Navboxes_colour"] = 4600,
["Navseasoncats"] = 230000,
["Navseasoncats_with_centuries_below_decade"] = 6700,
["Navseasoncats_with_decades_below_year"] = 16000,
["Navsource"] = 2500,
["Navy"] = 20000,
["Navy/core"] = 20000,
["Nay"] = 5900,
["Nbay"] = 5700,
["Nbhyph"] = 194000,
["Nbsp"] = 498000,
["Nbsp_to_space"] = 21000,
["Ndash"] = 23000,
["Nee"] = 11000,
["NeilBrownPlayers"] = 3100,
["New_user_bar"] = 57000,
["Newbot"] = 4300,
["Next_period"] = 22000,
["Nfly"] = 2300,
["Nihongo"] = 104000,
["Nihongo2"] = 12000,
["Nihongo_foot"] = 2700,
["No"] = 9100,
["No."] = 14000,
["No2"] = 11000,
["NoSpam"] = 3900,
["NoSpamEmail"] = 17000,
["No_col_break"] = 2400,
["No_col_break/styles.css"] = 2400,
["No_documentation"] = 2500,
["No_footnotes"] = 51000,
["No_ping"] = 383000,
["No_plot"] = 9100,
["No_redirect"] = 601000,
["No_spam"] = 297000,
["No_wrap"] = 2900,
["Nobold"] = 403000,
["Nobold/styles.css"] = 403000,
["Nobr"] = 5300,
["Nobreak"] = 681000,
["Nochange"] = 2600,
["Noindex"] = 4700,
["Noitalic"] = 4700,
["Noitalic/styles.css"] = 4700,
["Nom"] = 43000,
["Nominated"] = 7800,
["Non-English-language_text_category"] = 2700,
["Non-admin_closure"] = 3200,
["Non-admin_closure_(requested_moves)"] = 4600,
["Non-admin_comment"] = 2100,
["Non-album_single"] = 2200,
["Non-diffusing_subcategory"] = 17000,
["Non-free_2D_art"] = 7600,
["Non-free_3D_art"] = 2500,
["Non-free_album_cover"] = 213000,
["Non-free_audio_sample"] = 8500,
["Non-free_biog-pic"] = 27000,
["Non-free_book_cover"] = 56000,
["Non-free_character"] = 2500,
["Non-free_comic"] = 11000,
["Non-free_fair_use"] = 17000,
["Non-free_fair_use_in"] = 14000,
["Non-free_file_with_no_commercial_use_license"] = 2400,
["Non-free_film_poster"] = 28000,
["Non-free_film_screenshot"] = 5000,
["Non-free_game_cover"] = 8100,
["Non-free_game_screenshot"] = 5000,
["Non-free_historic_image"] = 16000,
["Non-free_image_data"] = 8400,
["Non-free_image_rationale"] = 9500,
["Non-free_logo"] = 157000,
["Non-free_magazine_cover"] = 7700,
["Non-free_media"] = 756000,
["Non-free_media_data"] = 9600,
["Non-free_media_rationale"] = 11000,
["Non-free_movie_poster"] = 25000,
["Non-free_music_video_screenshot"] = 2000,
["Non-free_newspaper_image"] = 2100,
["Non-free_poster"] = 82000,
["Non-free_promotional"] = 8800,
["Non-free_school_logo"] = 7500,
["Non-free_seal"] = 6600,
["Non-free_symbol"] = 5700,
["Non-free_television_screenshot"] = 16000,
["Non-free_title-card"] = 6300,
["Non-free_use_rationale"] = 699000,
["Non-free_use_rationale/styles.css"] = 709000,
["Non-free_use_rationale_2"] = 211000,
["Non-free_use_rationale_album_cover"] = 145000,
["Non-free_use_rationale_biog"] = 2100,
["Non-free_use_rationale_book_cover"] = 19000,
["Non-free_use_rationale_logo"] = 108000,
["Non-free_use_rationale_poster"] = 54000,
["Non-free_use_rationale_title-card"] = 3300,
["Non-free_use_rationale_video_cover"] = 6100,
["Non-free_use_rationale_video_game_cover"] = 11000,
["Non-free_video_cover"] = 16000,
["Non-free_video_game_cover"] = 22000,
["Non-free_video_game_cover/platform"] = 22000,
["Non-free_video_game_screenshot"] = 11000,
["Non-free_video_game_screenshot/platform"] = 9900,
["Non-free_with_NC"] = 2400,
["Non-free_with_permission"] = 2000,
["Non_breaking_hyphen"] = 195000,
["Nonumtoc"] = 2800,
["Nonumtoc/styles.css"] = 2800,
["Noping"] = 370000,
["Noplot"] = 2300,
["Noprint"] = 2900,
["Noredirect"] = 8400,
["Normal"] = 6700,
["Normalwraplink"] = 4900,
["North_America_topic"] = 3600,
["Nospam"] = 5300,
["Not-PD-US-expired-min-year"] = 26000,
["Not_a_ballot"] = 7900,
["Not_a_forum"] = 7800,
["Not_a_typo"] = 12000,
["Not_around"] = 8500,
["Not_done"] = 21000,
["Notability"] = 60000,
["Notavote"] = 2200,
["Notdone"] = 5700,
["Note"] = 25000,
["NoteFoot"] = 4500,
["NoteTag"] = 4600,
["Note_label"] = 9100,
["Notelist"] = 210000,
["Notelist-lr"] = 3800,
["Notelist-ua"] = 7400,
["Notes"] = 5600,
["Noteslist"] = 3500,
["Notice"] = 116000,
["NovelsWikiProject"] = 2400,
["Nowiki_="] = 2300,
["Nowrap"] = 1520000,
["Np"] = 3500,
["Npby"] = 2600,
["Nq"] = 4200,
["Nrut"] = 4500,
["Ns"] = 2900,
["Ns0"] = 110000,
["Ns_has_subpages"] = 2530000,
["Nts"] = 21000,
["Ntsh"] = 3400,
["Number_of_defined_parameters"] = 5300,
["Number_table_sorting"] = 36000,
["Number_table_sorting_hidden"] = 3400,
["Numero"] = 3700,
["Nutshell"] = 4000,
["Nw="] = 2300,
["Née"] = 2300,
["Module:NUMBEROFSECTIONS"] = 2100,
["Module:Namespace_detect"] = 625000,
["Module:Namespace_detect/config"] = 4940000,
["Module:Namespace_detect/data"] = 4940000,
["Module:National_squad"] = 55000,
["Module:Native_name"] = 97000,
["Module:Navbar"] = 5530000,
["Module:Navbar/configuration"] = 5530000,
["Module:Navbar/styles.css"] = 4860000,
["Module:Navbox"] = 4550000,
["Module:Navbox/configuration"] = 4550000,
["Module:Navbox/styles.css"] = 4550000,
["Module:Navbox_ice_hockey"] = 3200,
["Module:Navbox_top_and_bottom"] = 16000,
["Module:Navbox_with_collapsible_groups"] = 147000,
["Module:Navboxes"] = 59000,
["Module:Nihongo"] = 106000,
["Module:No_ping"] = 457000,
["Module:Noinclude"] = 5300,
["Module:Ns_has_subpages"] = 2530000,
["Module:Number_table_sorting"] = 38000,
}
1949a3e0df8144f6faa34c27923f8dc10f9e27c4
Sessions
0
4
4
2024-03-24T15:37:44Z
Vicht
1
Created page with "{| class="wikitable" ! scope="col" | Session ! scope="col" | Date ! scope="col" | Summary |- | [[Session 1|1]] | data-sort-value="2020-04-05" | 5 Apr 2020 | <i class="ship">[[The Crested Eagle]]</i> sinks in a storm. [[Kenneth]], [[Grokko]] and [[Vichthart]] reach [[Meeresdorf]]. |- | [[Session 2|2]] | data-sort-value="2020-04-19" | 19 Apr 2020 | |- | [[Session 3|3]] | data-sort-value="2020-05-03" | 3 May 2020 | The party kicks some [[goblin|gobbo]] ass. |- | Session..."
wikitext
text/x-wiki
{| class="wikitable"
! scope="col" | Session
! scope="col" | Date
! scope="col" | Summary
|-
| [[Session 1|1]]
| data-sort-value="2020-04-05" | 5 Apr 2020
| <i class="ship">[[The Crested Eagle]]</i> sinks in a storm. [[Kenneth]], [[Grokko]] and [[Vichthart]] reach [[Meeresdorf]].
|-
| [[Session 2|2]]
| data-sort-value="2020-04-19" | 19 Apr 2020
|
|-
| [[Session 3|3]]
| data-sort-value="2020-05-03" | 3 May 2020
| The party kicks some [[goblin|gobbo]] ass.
|-
| [[Session 4|4]]
| data-sort-value="2020-05-17" | 17 May 2020
|
|-
| [[Session 5|5]]
| data-sort-value="2020-06-07" | 7 Jun 2020
|
|-
| [[Session 6|6]]
| data-sort-value="2020-08-02" | 2 Aug 2020
|
|-
| [[Session 7|7]]
| data-sort-value="2020-08-09" | 9 Aug 2020
| The party delivers a message to the [[Judita Bandelmann|harbourmaster]]. Grokko finds a [[cat]].
|-
| [[Session 8|8]]
| data-sort-value="2020-08-16" | 16 Aug 2020
| Kenneth and Grokko trade away their [[Schnellhoof Carriagemaster's|carriage]] booking for a [[The Katz und Imp|nicer inn]].
|-
| [[Session 9|9]]
| data-sort-value="2020-08-23" | 23 Aug 2020
| Kenneth and Grokko identify a suspicious [[Senneborn warehouse|warehouse]] which the team stakes out then breaks into.
|-
| [[Session 10|10]]
| data-sort-value="2020-08-30" | 30 Aug 2020
| The party battles smugglers in the basement of the warehouse.
|-
| [[Session 11|11]]
| data-sort-value="2020-09-13" | 13 Sep 2020
| The party interrogates the surviving smuggler and enters [[Detlef]]'s lair by the secret fireplace entrance.
|-
| [[Session 12|12]]
| data-sort-value="2020-10-04" | 4 Oct 2020
| [[Talyen Tales]]—[[The Piß Keepers]] lose [[Seebo]] to his gambling debts.
|-
| [[Session 13|13]]
| data-sort-value="2020-10-25" | 25 Oct 2020
|
|-
| [[Session 14|14]]
| data-sort-value="2020-11-08" | 8 Nov 2020
|
|-
| [[Session 15|15]]
| data-sort-value="2020-11-14" | 14 Nov 2020
|
|-
| [[Session 16|16]]
| data-sort-value="2020-11-22" | 22 Nov 2020
|
|-
| [[Session 17|17]]
| data-sort-value="2020-12-06" | 6 Dec 2020
|
|-
| [[Session 18|18]]
| data-sort-value="2020-12-13" | 13 Dec 2020
|
|-
| [[Session 19|19]]
| data-sort-value="2020-12-20" | 20 Dec 2020
|
|-
| [[Session 20|20]]
| data-sort-value="2021-01-03" | 3 Jan 2021
|
|-
| [[Session 21|21]]
| data-sort-value="2021-01-10" | 10 Jan 2021
|
|-
| [[Session 22|22]]
| data-sort-value="2021-01-17" | 17 Jan 2021
|
|-
| [[Session 23|23]]
| data-sort-value="2021-02-07" | 7 Feb 2021
|
|-
| [[Session 24|24]]
| data-sort-value="2021-02-14" | 14 Feb 2021
|
|-
| [[Session 25|25]]
| data-sort-value="2021-02-21" | 21 Feb 2021
| [[Droghen]] instructs the party to kill [[Srir]] or he'll destroy [[Meeresdorf]]. He gives them a [[symbol of Bane]] and instructions them to find [[Jenora Greenheart]]. The party trades with the [[faerie dragon]]s then returns to Meeresdorf. [[Kham]] dreams of a demon's lair.
|-
| [[Session 26|26]]
| data-sort-value="2021-03-07" | 7 Mar 2021
| The party meets [[Jenora Greenheart]].
|-
| [[Session 27|27]]
| data-sort-value="2021-03-14" | 14 Mar 2021
| The party faces a [[gnoll]] hunting party.
|-
| [[Session 28|28]]
| data-sort-value="2021-03-21" | 21 Mar 2021
| The party reaches the [[gnoll]] encampment.
|-
| [[Session 29|29]]
| data-sort-value="2021-03-28" | 28 Mar 2021
| The party attacks the [[gnoll]]s in the encampment.
|-
| [[Session 30|30]]
| data-sort-value="2021-04-11" | 11 Apr 2021
| The party begins exploring the tunnels below the [[stone tower]] in the lake and fight a giant [[hyena]]. [[Vichthart]] gets the giggles.
|-
| [[Session 31|31]]
| data-sort-value="2021-04-25" | 25 Apr 2021
| [[Grokko]] desecrates an altar to [[Gruumsh]], a [[gnoll]] packlord carries [[Ogak]]'s head.
|-
| [[Session 32|32]]
| data-sort-value="2021-05-16" | 16 May 2021
| Grokko and Kham sort their loot then head above ground to finish off the [[gnoll]]s and free the [[Dancing in the Storm|ship's]] crew.
|-
| [[Session 33|33]]
| data-sort-value="2021-06-06" | 6 Jun 2021
| Grokko gives [[Jenora Greenheart]] his luck in exchange for [[Szehga]]. Party returns to Meeresdorf.
|-
| [[Session 34|34]]
| data-sort-value="2021-06-27" | 27 Jun 2021
| The party prepares to head to the island on <i class="ship">[[Dancing in the Storm]]</i>.
|-
| [[Session 35|35]]
| data-sort-value="2021-07-04" | 4 Jul 2021
| <i class="ship">Dancing in the Storm</i> travels to the [[Zaheer island|island]].
|-
| [[Session 36|36]]
| data-sort-value="2021-07-25" | 25 Jul 2021
| The party sneaks out of the slave village and into the caves. [[Kham]] recognizes the demon's lair.
|-
| [[Session 37|37]]
| data-sort-value="2021-08-08" | 8 Aug 2021
| The party fights [[demon]]s and [[undead]], finds a spiral catacomb.
|-
| [[Session 38|38]]
| data-sort-value="2021-08-22" | 22 Aug 2021
| The party meets a race of [[troglodyte|lizard-like beings]] and sees the [[giant demon]] for the first time.
|-
| [[Session 39|39]]
| data-sort-value="2021-08-29" | 29 Aug 2021
| Kham finds [[Ingen]]'s satchel. [[Grokko]] and [[Vicht]] flee the [[giant demon]].
|-
| [[Session 40|40]]
| data-sort-value="2021-09-05" | 5 Sep 2021
| Vicht barely contains his righteous anger. Kham nearly falls off a bridge.
|-
| [[Session 41|41]]
| data-sort-value="2021-09-26" | 26 Sep 2021
| Huge numbers of [[gnoll]]s and rats. Grokko loses his hair.
|-
| [[Session 42|42]]
| data-sort-value="2021-10-03" | 3 Oct 2021
| The party avoids [[boar demon]]s and meets [[Kylian]], Keeper of the Temple.
|-
| [[Session 43|43]]
| data-sort-value="2021-10-31" | 31 Oct 2021
| The party frees the first [[throat]] and loots the [[gnoll]]s' dorms.
|-
| [[Session 44|44]]
| data-sort-value="2021-11-07" | 7 Nov 2021
| The party fights [[hyena]]e that turn into [[gnoll]]s, and frees the second [[throat]].
|-
| [[Session 45|45]]
| data-sort-value="2021-11-14" | 14 Nov 2021
| The party frees the final two [[throat]]s.
|-
| [[Session 46|46]]
| data-sort-value="2021-11-28" | 28 Nov 2021
| [[Srir Silthallow]] is killed but [[Rrekkeh Stormcrawler]] escapes.
|-
| [[Session 47|47]]
| data-sort-value="2021-12-05" | 5 Dec 2021
| The slaves have revolted and the demons have vanished.
|-
| [[Session 48|48]]
| data-sort-value="2022-01-02" | 2 Jan 2022
| The party goes to [[Senneborn]] then takes 10 days to travel to [[Kaarst]].
|-
| [[Session 49|49]]
| data-sort-value="2022-01-23" | 23 Jan 2022
| [[Four adventurers]] find the barrow of [[Kaelinu]] and fight [[Will-o'-wisp]]s.
|-
| [[Session 50|50]]
| data-sort-value="2022-01-30" | 30 Jan 2022
| Four adventurers recover the sword of [[Kaelinu]].
|-
| [[Session 51|51]]
| data-sort-value="2022-03-06" | 6 Mar 2022
| 11th [[Thelliea]]: The party arrives in [[Kaarst]] and meets [[Cardinal Silkendawn]].
|-
| [[Session 52|52]]
| data-sort-value="2022-03-20" | 20 Mar 2022
| The party meets [[Mira]] and [[Ginger]] down a dark alley.
|-
| [[Session 53|53]]
| data-sort-value="2022-04-10" | 10 Apr 2022
| An [[Iron Tempest]] group from [[Havenhaft]] protects a farm from [[orc]]s.
|-
| [[Session 54|54]]
| data-sort-value="2022-04-24" | 24 Apr 2022
| 12th [[Thelliea]]: Examining [[Sombre Lyceum]] and murder victims' bodies.
|-
| [[Session 55|55]]
| data-sort-value="2022-05-22" | 22 May 2022
| The party is kicked out of [[Squall's Beacon]] and enters [[Kobolwitz Manor]].
|-
| [[Session 56|56]]
| data-sort-value="2022-06-19" | 19 Jun 2022
| The party explores the upstairs of [[Kobolwitz Manor]].
|-
| [[Session 57|57]]
| data-sort-value="2022-07-10" | 10 Jul 2022
| Clues in the basement of [[Kobolwitz Manor]]. Mira encounters a [[mimic]].
|-
| [[Session 58|58]]
| data-sort-value="2022-07-24" | 24 Jul 2022
| Return to [[Squall's Beacon]].
|-
| [[Session 59|59]]
| data-sort-value="2022-09-11" | 11 Sep 2022
| [[false stalactite|Stalactites]] and [[grey ooze|oily puddles]] attack in the long-lost sewers of [[Kaarst]].
|-
| [[Session 60|60]]
| data-sort-value="2022-09-18" | 18 Sep 2022
| Mind-controlled [[ghoul]]s attack; [[Eurgaran Wihta]]'s fingers are found.
|-
| [[Session 61|61]]
| data-sort-value="2022-10-16" | 16 Oct 2022
| Grokko buys a potion from [[Tiaathque's Medicinal Remedies|Tiaathque's]], Kham summons [[Grimm]].
|-
| [[Session 62|62]]
| data-sort-value="2022-10-23" | 23 Oct 2022
| Acting [[Captain Daergel]] gives addresses, [[Captain Teneithra]]'s husband.
|-
| [[Session 63|63]]
| data-sort-value="2022-10-30" | 30 Oct 2022
| [[Waterworks Guild]] can't give a map, sewer in alley where [[Captain Teneithra|Cpt]] was jumped.
|-
| [[Session 64|64]]
| data-sort-value="2022-12-04" | 4 Dec 2022
| Footprints in the sewers lead to a [[warehouse]]. [[Mira]] and [[Grokko]] stake it out.
|-
| [[Session 65|65]]
| data-sort-value="2022-12-18" | 18 Dec 2022
| [[Vicht]] and [[Kham]] are ambushed by wizards, Grokko gets bitten.
|-
| [[Session 66|66]]
| data-sort-value="2023-01-08" | 8 Jan 2023
| Assailants are taken to jail but no one attacks [[the Copper Roost]].
|-
| [[Session 67|67]]
| data-sort-value="2023-03-05" | 5 Mar 2023
| Captives are questioned, and a jailbreak is made for [[Uthan]].
|-
| [[Session 68|68]]
| data-sort-value="2023-03-19" | 19 Mar 2023
| [[Irann Rhogar]] arranges for a tour of <i class="ship">[[Hope's Prize]]</i>.
|-
| [[Session 69|69]]
| data-sort-value="2023-04-16" | 16 Apr 2023
| First meeting with [[the Tide]] at [[Baron's Casket]].
|-
| [[Session 70|70]]
| data-sort-value="2023-05-28" | 28 May 2023
| All aboard <i class="ship">[[Hope's Prize]]</i>.
|-
| [[Session 71|71]]
| data-sort-value="2023-06-04" | 4 Jun 2023
| Attacked by three [[vampire]]s, <i class="ship">[[Hope's Prize]]</i> sinks.
|-
| [[Session 72|72]]
| data-sort-value="2023-06-11" | 11 Jun 2023
| Exploring the [[Valiant Morgen Trading Company headquarters]].
|-
| [[Session 73|73]]
| data-sort-value="2023-06-25" | 25 Jun 2023
| Mira and Grokko have dreams.
|-
| [[Session 74|74]]
| data-sort-value="2023-08-13" | 13 Aug 2023
| The [[Sable Warden]] debriefs and prepares, Kham is revealed.
|-
| [[Session 75|75]]
| data-sort-value="2023-09-24" | 24 Sep 2023
| [[Nothing]]s and a [[devil]] appear in the [[Acropolis of Kereskaa|underground towers]].
|-
| [[Session 76|76]]
| data-sort-value="2023-10-01" | 1 Oct 2023
| Meeting [[Suithrathus Luirmo]], Master of [[Divination]]
|-
| [[Session 77|77]]
| data-sort-value="2023-10-15" | 15 Oct 2023
| Mira loses all his money (and some height) to a [[mirror]]
|-
| [[Session 78|78]]
| data-sort-value="2023-11-12" | 12 Nov 2023
|
|-
| [[Session 79|79]]
| data-sort-value="2023-11-26" | 26 Nov 2023
| Crossing the fallen [[Spire of Necromancy]] to find [[Tiaathque Leagallow]].
|-
| [[Session 80|80]]
| data-sort-value="2023-12-03" | 3 Dec 2023
| The [[Obsidian Claw]] is recovered from the vaults.
|-
| [[Session 81|81]]
| data-sort-value="2024-01-14" | 14 Jan 2024
|
|-
| [[Session 82|82]]
| data-sort-value="2024-03-03" | 3 Mar 2024
|
|-
| [[Session 83|83]]
| data-sort-value="2024-03-17" | 17 Mar 2024
|
|-
|}
cce94d016820b78742e7174a9705c0308c52c3ed
Timeline
0
5
5
2024-03-24T17:12:00Z
Vicht
1
Created page with "== Ancient history == * Age of Great Ruin—soul of a Great Wyrm becomes held by [[Dragon Orb of Drimysthonontas]] * Age of Enlightenment—[[Squall's Beacon]] constructed in [[Farankaars]] * [[Kereskaa]] contains Dragon Orb of Drimysthonontas, [[Acropolis of Kereskaa]] built above it * A servant of [[Correlan]] gifts a [[tree from the Feywild]] to the Acropolis of Kereskaa for a good deed done * [[Master Suithrathus Luirmo]] begins his tenure at Acropolis of Kereskaa *..."
wikitext
text/x-wiki
== Ancient history ==
* Age of Great Ruin—soul of a Great Wyrm becomes held by [[Dragon Orb of Drimysthonontas]]
* Age of Enlightenment—[[Squall's Beacon]] constructed in [[Farankaars]]
* [[Kereskaa]] contains Dragon Orb of Drimysthonontas, [[Acropolis of Kereskaa]] built above it
* A servant of [[Correlan]] gifts a [[tree from the Feywild]] to the Acropolis of Kereskaa for a good deed done
* [[Master Suithrathus Luirmo]] begins his tenure at Acropolis of Kereskaa
* Veteran of the [[Blood Wars]], [[Vastren]] is summoned into the catacomb beneath the [[Spire of ]]
* 576th year of the Age of Enlightenment—[[Teklanna Morantine]] betrays the Acropolis of Kereskaa to the [[Kytheran]]s, who destroy the Acropolis
* [[Tyrant]] rules [[Kaarst]], their statue is collapsed into the bay leaving [[Tyrant's Folly]]
* Age of Decadence—arcane magic is used for unpleasant purposes in Kaarst
* [[Great War]] between gods of good and evil for hundreds of years; flying cities used as weapons
* Thousands of years ago, Great War is ended by [[Divine Accords]]; [[Bahamut]] and [[Teli Monei]] sign
== Recent history==
; 3 generations ago
: Founding of Arkhellen Empire; 12 churches are united as [[Verein Kirche]]
; >80 years ago
: Birth of [[Maurul Silkendawn]]
; 55–59 years ago
: Birth of [[Reginald Kobolwitz]]
; 47 years ago
: Birth of [[Traulam Eugen]]
; 35 years ago
: Birth of [[Lorenzo Arkhelle]]
; 12 years ago
: [[King Lorenzo Arkhelle XVI]] becomes 3rd Emperor of the Empire
; 10 years ago
: [[Anrel]] is living in [[Kaarst]] having been raised by the church there
; <10 years ago
: [[Mirark]]'s tiefling friend disappears
; 8 years ago
: [[Amnon Ingolidan]] begins working at [[Squall's Beacon]]; [[Felosiel Teinithra]] and [[Ruda Frank]] marry
; 7 years ago
: [[Anrel]]'s last excursion [[Fuarcrùn Freeholds|north]]; he is the only survivor
; 6–7 years ago
: [[Felosiel Teinithra]] becomes captain of [[Kaarst City Watch]]
; ~5 years ago
: [[Kham]] is the only person still speaking to [[Elira Lein]]
; 3 years ago
: [[Eurgaran Wihta]] begins working at [[Squall's Beacon]]; [[Orryn Daergel]] is promoted from Private to Sergeant in [[Kaarst City Watch]]
; 2 years ago
: [[Felosiel Teinithra]] and [[Ruda Frank]] move to their current home
== 1853 Post-Accord ==
; 25 Skaerentsa
: [[Captain Adran Mokam|Captain]] and [[Thava Windreaver|boatswain]] found dead on <i class="ship">[[Hope's Prize]]</i>
; 2 months ago
: [[Beatrux]] is brought to the [[Zaheer island]] as a slave by [[gnoll]]s
; 3 weeks ago
: [[Ser Kobolwitz]]'s [[Claira Hanali|housekeeper]] leaves work to visit family in [[Salzreich]]
; Early Maneseed
: [[Valiant Morgen Trading Company]] purchases a [[Valiant Morgen Trading Company warehouse|warehouse]]
; 19 Maneseed
: Last sighting of [[Father Traulam Eugen]]
; 3 Thirkuoss
: [[Ser Kobolwitz]]'s body found in his [[Kobolwitz Manor|manor]] drawing room
; 10 Thirkuoss
: [[Thodris Holderhek]]'s body found in [[Sombre Lyceum]]
; 15 Thirkuoss
: [[Eurgaran Wihta]] leaves home but does not arrive at [[Squall's Beacon]]
; 17 Thirkuoss
: [[Eurgaran Wihta]]'s body found floating in harbour
; 25 Thirkuoss
: Party arrives at [[gnoll]] camp in [[Aleph Marsh]]
; 26 Thirkuoss
: Slaves are freed from [[gnoll]] camp and sail to [[Meeresdorf]]
; 27 Thirkuoss
: Party arrives on the [[Zaheer island|island]] and escapes the slave camp
; 28 Thirkuoss
: Party meets ghosts and [[troglodyte|lizard-type folk]] in the [[Zaheer island|island]] caves
; 29 Thirkuoss
: [[Srir Silthallow]] is defeated but [[Rrekkeh Stormcrawler]] escapes
; 30 Thirkuoss
: Survivors leave the [[Zaheer island|island]] aboard <i class="ship">[[Dancing in the Storm]]</i>
; 31 Thirkuoss
: <i class="ship">[[Dancing in the Storm]]</i> departs [[Meeresdorf]] for [[Senneborn]]
; 1 Thelliea
: <i class="ship">[[Dancing in the Storm]]</i> arrives in [[Senneborn]]; Party departs for [[Kaarst]]
; 3 Thelliea
: Last sighting of [[Captain Felosial Teinithra]] by [[Sergeant Doudra]]
; 11 Thelliea
: Party arrives in [[Kaarst]], visits [[Kade Sirrine Kathedrale]], [[Mira]] joins
; 12 Thelliea
: Party visits [[Kobolwitz Manor]] and [[Squall's Beacon]]
; 13 Thelliea
: Discovery and stakeout of [[Valiant Morgen Trading Company warehouse|Valiant Morgen warehouse]]
; 14 Thelliea
: Interrogation of captives, jailbreak of [[Uthan]], meeting [[the Tide]], investigating [[Valiant Morgen Trading Company|Valiant Morgen]]
; 15 Thelliea
: [[Sable Warden]] sends party to [[Acropolis of Karaskaa]], party stops [[Knives of Mystra]] just before sunset, meeting of [[Kaarst City Council]]
; 16 Thelliea
: <i class="ship">[[Hope's Prize]]</i> was due to depart [[Kaarst]]
23e8a8f9b20a9c1b64bc7c594966304b8050f7af
Calendar
0
6
6
2024-03-24T17:22:18Z
Vicht
1
Created page with "{| class="wikitable" ! scope="col" | Month ! scope="col" | Days ! scope="col" | Notes |- | Faern || 31 || |- | Sotha'nath || 30 || |- | Primseed || 30 || |- | Seanchai || 31 || |- | Mor || 30 || |- | Coreivae || 30 || |- | Skaerensta || 31 || |- | Maneseed || 30 || |- | Thirkuoss || 31 || |- | Thelliea || 30* | Every 4 years a 31st day is added, usually celebrated as a night of ascension |- | Secundmor || 31 || |- | Onexmet || 30 || |- |}"
wikitext
text/x-wiki
{| class="wikitable"
! scope="col" | Month
! scope="col" | Days
! scope="col" | Notes
|-
| Faern || 31 ||
|-
| Sotha'nath || 30 ||
|-
| Primseed || 30 ||
|-
| Seanchai || 31 ||
|-
| Mor || 30 ||
|-
| Coreivae || 30 ||
|-
| Skaerensta || 31 ||
|-
| Maneseed || 30 ||
|-
| Thirkuoss || 31 ||
|-
| Thelliea || 30*
| Every 4 years a 31st day is added, usually celebrated as a night of ascension
|-
| Secundmor || 31 ||
|-
| Onexmet || 30 ||
|-
|}
8e4e05d59e832b9dad995e5b4cf2a50464d5abf3
The Piß Keepers
0
7
7
2024-03-24T17:25:02Z
Vicht
1
Created page with "A band of brothers comprising [[Elias]], [[Seebo]], [[Slabbledab]], [[Cora Hothead]] and [[Grezz]]. They play music in the taverns of [[Bergstraßer]], [[Denkrei]]."
wikitext
text/x-wiki
A band of brothers comprising [[Elias]], [[Seebo]], [[Slabbledab]], [[Cora Hothead]] and [[Grezz]]. They play music in the taverns of [[Bergstraßer]], [[Denkrei]].
acc8f1ed917563ad737d0dc6117022fb5e8a00a4
Elias
0
8
8
2024-03-24T17:46:31Z
Vicht
1
Created page with "[[Kenku]] [[cleric]] of [[Sarenrae]] and member of [[The Piß Keepers]]. Played by [[Traggey]]. [[Category:Clerics]] [[Category:Worshippers of Sarenrae]] [[Category:Members of The Piß Keepers]] [[Category:Characters played by Traggey]]"
wikitext
text/x-wiki
[[Kenku]] [[cleric]] of [[Sarenrae]] and member of [[The Piß Keepers]]. Played by [[Traggey]].
[[Category:Clerics]]
[[Category:Worshippers of Sarenrae]]
[[Category:Members of The Piß Keepers]]
[[Category:Characters played by Traggey]]
2794236c7f1322e8c27276651c726edba739f3b1
Grezz
0
9
9
2024-03-24T17:47:49Z
Vicht
1
Created page with "[[Kobold]] member of [[The Piß Keepers]], albeit difficult to determine if he qualifies more as a pet. Played by [[Wil]]. [[Category:Members of The Piß Keepers]] [[Category:Characters played by Wil]]"
wikitext
text/x-wiki
[[Kobold]] member of [[The Piß Keepers]], albeit difficult to determine if he qualifies more as a pet. Played by [[Wil]].
[[Category:Members of The Piß Keepers]]
[[Category:Characters played by Wil]]
0197b06ce11de7308675ad2b7040ce6129e89a52
12
9
2024-03-24T17:50:36Z
Vicht
1
Vicht moved page [[Seebo]] to [[Grezz]] without leaving a redirect: Posted to Seebo accidentally
wikitext
text/x-wiki
[[Kobold]] member of [[The Piß Keepers]], albeit difficult to determine if he qualifies more as a pet. Played by [[Wil]].
[[Category:Members of The Piß Keepers]]
[[Category:Characters played by Wil]]
0197b06ce11de7308675ad2b7040ce6129e89a52
Cora Hothead
0
10
11
2024-03-24T17:49:32Z
Vicht
1
Created page with "Surprisingly patient (or maybe just fatigued) mother figure of [[The Piß Keepers]]. Played by [[Manco]]. [[Category:Members of The Piß Keepers]] [[Category:Characters played by Manco]]"
wikitext
text/x-wiki
Surprisingly patient (or maybe just fatigued) mother figure of [[The Piß Keepers]]. Played by [[Manco]].
[[Category:Members of The Piß Keepers]]
[[Category:Characters played by Manco]]
4f9b1aef826d1c6004ffc3060354a9c71eab1e8f
Slabbledab
0
11
13
2024-03-24T18:36:33Z
Vicht
1
Created page with "[[Goblin]] member of [[The Piß Keepers]]. Played by [[Kevin]]. [[Category:Members of The Piß Keepers]] [[Category:Characters played by Kevin]]"
wikitext
text/x-wiki
[[Goblin]] member of [[The Piß Keepers]]. Played by [[Kevin]].
[[Category:Members of The Piß Keepers]]
[[Category:Characters played by Kevin]]
977d4c03b2633cea4ed82105be99f1dc918dce45
Seebo
0
12
14
2024-03-24T18:38:04Z
Vicht
1
Redirected page to [[Seebo Clattercast]]
wikitext
text/x-wiki
#REDIRECT [[Seebo Clattercast]]
6220910d90673234e950cd0b39786707853255db
Seebo Clattercast
0
13
15
2024-03-24T18:38:38Z
Vicht
1
Created page with "[[Gnome]] member of [[The Piß Keepers]], gets kidnapped because of his gambling debts. [[Category:Members of The Piß Keepers]]"
wikitext
text/x-wiki
[[Gnome]] member of [[The Piß Keepers]], gets kidnapped because of his gambling debts.
[[Category:Members of The Piß Keepers]]
fca0e77f9a6863f0a16e77871c9c4fbe29ee43ce
Clattercast
0
14
16
2024-03-24T18:39:00Z
Vicht
1
Redirected page to [[Seebo Clattercast]]
wikitext
text/x-wiki
#REDIRECT [[Seebo Clattercast]]
6220910d90673234e950cd0b39786707853255db
Cora
0
15
17
2024-03-24T18:39:15Z
Vicht
1
Redirected page to [[Cora Hothead]]
wikitext
text/x-wiki
#REDIRECT [[Cora Hothead]]
3888a074f64307964717c7717082a50fd2fa1566
Hothead
0
16
18
2024-03-24T18:39:25Z
Vicht
1
Redirected page to [[Cora Hothead]]
wikitext
text/x-wiki
#REDIRECT [[Cora Hothead]]
3888a074f64307964717c7717082a50fd2fa1566
Iron Fang
0
17
19
2024-03-24T18:59:22Z
Vicht
1
Created page with "Found in [[Bergstraßer]], [[Denkrei]]."
wikitext
text/x-wiki
Found in [[Bergstraßer]], [[Denkrei]].
b85f36a57e0a7ca7d6e02e87b10be8e43c113070
Doug Zenner
0
18
20
2024-03-24T19:00:02Z
Vicht
1
Created page with "A miner in [[Bergstraßer]] who goes missing."
wikitext
text/x-wiki
A miner in [[Bergstraßer]] who goes missing.
998bfc450a1877c1e0928ec1889ab59abe74cd24
Doug
0
19
21
2024-03-24T19:00:29Z
Vicht
1
Redirected page to [[Doug Zenner]]
wikitext
text/x-wiki
#REDIRECT [[Doug Zenner]]
10817b618cae4aad35c1e07659214697603f2500
Zenner
0
20
22
2024-03-24T19:02:43Z
Vicht
1
Redirected page to [[Doug Zenner]]
wikitext
text/x-wiki
#REDIRECT [[Doug Zenner]]
10817b618cae4aad35c1e07659214697603f2500
Bergstraßer
0
21
23
2024-03-24T19:05:01Z
Vicht
1
Created page with "Mining town in [[Denkrei]]. Has a church of [[Sarenrae]]. The [[Iron Fang]] is here, and [[The Piß Keepers]] perform in taverns here."
wikitext
text/x-wiki
Mining town in [[Denkrei]]. Has a church of [[Sarenrae]]. The [[Iron Fang]] is here, and [[The Piß Keepers]] perform in taverns here.
a5611a9bdf638edda882a35aa961591126f2a958
33
23
2024-03-24T23:28:26Z
Vicht
1
wikitext
text/x-wiki
Mining town in [[Denkrei]]. Has a church of [[Sarenrae]]. The [[Iron Fang]] is here, and [[The Piß Keepers]] perform in taverns here.
[[File:Bergstrasser, Denkrei.png|thumb|center|upright=2|Map of Bergstraßer]]
[[Category:Settlements]]
d9bf00dda9d2bb7118906a189661831b976f439b
Smit
0
22
24
2024-03-24T20:11:18Z
Vicht
1
Redirected page to [[Kenneth Smit]]
wikitext
text/x-wiki
#REDIRECT [[Kenneth Smit]]
553257b17a401ae33d07f97aba26f64198ede842
25
24
2024-03-24T20:11:41Z
Vicht
1
Changed redirect target from [[Kenneth Smit]] to [[Kenneth]]
wikitext
text/x-wiki
#REDIRECT [[Kenneth]]
306033fc0402bb5159dcc163f33c0c6bc1c42600
Kenneth Smit
0
23
26
2024-03-24T20:11:58Z
Vicht
1
Redirected page to [[Kenneth]]
wikitext
text/x-wiki
#REDIRECT [[Kenneth]]
306033fc0402bb5159dcc163f33c0c6bc1c42600
Vicht
0
24
27
2024-03-24T20:12:26Z
Vicht
1
Redirected page to [[Vichthart]]
wikitext
text/x-wiki
#REDIRECT [[Vichthart]]
6cdfe88e56ca9d0eab9bd30f4aee10d9b737199f
Father Vichthart
0
25
28
2024-03-24T20:12:52Z
Vicht
1
Redirected page to [[Vichthart]]
wikitext
text/x-wiki
#REDIRECT [[Vichthart]]
6cdfe88e56ca9d0eab9bd30f4aee10d9b737199f
Father Vichthart Fezzilbahn
0
26
29
2024-03-24T20:13:14Z
Vicht
1
Redirected page to [[Vichthart]]
wikitext
text/x-wiki
#REDIRECT [[Vichthart]]
6cdfe88e56ca9d0eab9bd30f4aee10d9b737199f
Vichthart Fezzilbahn
0
27
30
2024-03-24T20:13:29Z
Vicht
1
Redirected page to [[Vichthart]]
wikitext
text/x-wiki
#REDIRECT [[Vichthart]]
6cdfe88e56ca9d0eab9bd30f4aee10d9b737199f
Kenneth
0
28
31
2024-03-24T20:39:17Z
Vicht
1
Created page with "<dfn><b>Kenneth Smit</b></dfn> is an [[Artificer]] specializing in Artillerism who joins [[Grokko]] and [[Vichthart]] when their ship, <i class="ship">The Crested Eagle</i>, sank in a mysterious storm off the coast near [[Meeresdorf]]. Known for his use of the [[Magic Stone]] cantrip, for which Grokko calls him <b>Stone Boy</b>. Builds a pair of [[Goggles of Night|goggles that bestow night vision]] that he shares with Vichthart until his departure, and begins making el..."
wikitext
text/x-wiki
<dfn><b>Kenneth Smit</b></dfn> is an [[Artificer]] specializing in Artillerism who joins [[Grokko]] and [[Vichthart]] when their ship, <i class="ship">The Crested Eagle</i>, sank in a mysterious storm off the coast near [[Meeresdorf]]. Known for his use of the [[Magic Stone]] cantrip, for which Grokko calls him <b>Stone Boy</b>. Builds a pair of [[Goggles of Night|goggles that bestow night vision]] that he shares with Vichthart until his departure, and begins making [[eldritch cannon]]s that can function as a flamethrower. Kenneth goes triggerhappy when he first uses his flamethrower, cutting down smugglers as they try to flee.
Kenneth used to fight alongside [[Kerstin Pletscher]] near the [[Sternwall]], [[Bükerstadt]], but hails originally from somewhere not far south of [[Hellenhelm]]. His friend [[Nikola]] has not been found since Bükerstadt was occupied by [[orc]]s. According to a rumour heard by Vichthart on <i class="ship">The Crested Eagle</i>, Kenneth once made a small fortune in the south running a trade caravan.
Kenneth began staying behind to protect others starting in [[Droghen’s keep]], when he stays in the dungeon to protect its human prisoners. He then stays in Meeresdorf while Grokko, [[Kham]] and Vicht find <i class="Dancing in the Storm">Dancing in the Storm</i> to keep the village protected in case [[Droghen]] decides to attack it. After that, he again stays with the [[Zaheer island|island's]] slaves instead of going to confront [[Srir]]. He elects to leave the party permanently once Srir is defeated, taking his Goggles of the Night with him.
[[Category:Characters played by Kevin]]
[[Category:Artificers]]
[[Category:Members of the Iron Tempest Mercenary Company]]
3f3c44bb8b866e2a1f4a32d340fe5cfdd2b7139b
File:Bergstrasser, Denkrei.png
6
29
32
2024-03-24T23:03:13Z
Vicht
1
Map of [[Bergstraßer]], [[Denkrei]]
wikitext
text/x-wiki
== Summary ==
Map of [[Bergstraßer]], [[Denkrei]]
93bca322994c37266564636f78b69da6d7c091fa
Avandra
0
30
34
2024-03-25T00:17:27Z
Vicht
1
Created page with "God of Luck of Fortune. One of the twelve gods of [[Verein Kirche von Arkhelle]]. Depicted as a [[halfling]] with a carefree smile, running through a cornfield of gold, copper and yellow. Their symbol is worn by the acting priestess of [[Church of St Anorad]] in [[Senneborn]] after its regular priest—[[Father Traulam Eugen]]—is summoned to [[Kaarst]]. [[Category:Gods of Verein Kirche von Arkhelle]]"
wikitext
text/x-wiki
God of Luck of Fortune. One of the twelve gods of [[Verein Kirche von Arkhelle]]. Depicted as a [[halfling]] with a carefree smile, running through a cornfield of gold, copper and yellow. Their symbol is worn by the acting priestess of [[Church of St Anorad]] in [[Senneborn]] after its regular priest—[[Father Traulam Eugen]]—is summoned to [[Kaarst]].
[[Category:Gods of Verein Kirche von Arkhelle]]
a85770253a394aaeffb3a7b00811d34f703befe6
37
34
2024-03-25T01:01:58Z
Vicht
1
Added Halflings
wikitext
text/x-wiki
God of Luck of Fortune. One of the twelve gods of [[Verein Kirche von Arkhelle]]. Depicted as a [[halfling]] with a carefree smile, running through a cornfield of gold, copper and yellow. Their symbol is worn by the acting priestess of [[Church of St Anorad]] in [[Senneborn]] after its regular priest—[[Father Traulam Eugen]]—is summoned to [[Kaarst]].
[[Category:Gods of Verein Kirche von Arkhelle]]
[[Category:Halflings]]
de45339898aacbf128abc06dbf14db3a9df70a47
46
37
2024-03-25T20:04:01Z
Vicht
1
Added name ‘Lady Grace’
wikitext
text/x-wiki
The <b>Lady Grace</b>, goddess of Luck of Fortune. One of the twelve gods of [[Verein Kirche von Arkhelle]]. Depicted as a [[halfling]] with a carefree smile, running through a cornfield of gold, copper and yellow. Their symbol is worn by the acting priestess of [[Church of St Anorad]] in [[Senneborn]] after its regular priest—[[Father Traulam Eugen]]—is summoned to [[Kaarst]].
[[Category:Gods of Verein Kirche von Arkhelle]]
[[Category:Halflings]]
bfaaa511e4c4479dc65214bf0a4152a6ea39014f
Bahamut
0
31
35
2024-03-25T00:56:47Z
Vicht
1
Created page with "The <b>Platinum Guard</b>, god of Justice and Judgement. A huge platinum [[dragon]] with brilliant scales and a great mane. One of the twelve gods of [[Verein Kirche von Arkhelle]], worshipped by [[St Anorad]], [[Father Traulam Eugen]], and Acting Captain of [[Kaarst City Watch]], [[Orryn Daergel]]. In fact, [[Kaarst]] has a high proportion of worshippers of <b>Bahamut</b>, and [[Kade Sirrine Kathedrale]] is the base of [[Cardinal Maurul Silkendawn]], the head of the chu..."
wikitext
text/x-wiki
The <b>Platinum Guard</b>, god of Justice and Judgement. A huge platinum [[dragon]] with brilliant scales and a great mane. One of the twelve gods of [[Verein Kirche von Arkhelle]], worshipped by [[St Anorad]], [[Father Traulam Eugen]], and Acting Captain of [[Kaarst City Watch]], [[Orryn Daergel]]. In fact, [[Kaarst]] has a high proportion of worshippers of <b>Bahamut</b>, and [[Kade Sirrine Kathedrale]] is the base of [[Cardinal Maurul Silkendawn]], the head of the church of Bahamut.
Bahamut represented the gods of good at the summit where the [[Divine Accord]] was signed. A huge marble sculpture in Kade Sirrine Kathedrale depicts Bahamut and [[Teli Monei]] signing the Divine Accord.
[[Kham]] carries a [[Badge of the Platinum Dragon]], and uses it several times to signal his authority, although he claims it carries no real weight anymore.
[[Category:Gods of Verein Kirche von Arkhelle]]
[[Category:Dragons]]
bb21e01da8eb4e9f833263a9a2be2896585f27a0
Erathis
0
32
36
2024-03-25T01:01:10Z
Vicht
1
Created page with "The <b>Architect Unceasing</b>, goddess of Civilization and Architecture. One of the twelve gods of [[Verein Kirche von Arkhelle]]. A woman who wears complicated patterns of navy, gold and grey. [[Category:Gods of Verein Kirche von Arkhelle]]"
wikitext
text/x-wiki
The <b>Architect Unceasing</b>, goddess of Civilization and Architecture. One of the twelve gods of [[Verein Kirche von Arkhelle]]. A woman who wears complicated patterns of navy, gold and grey.
[[Category:Gods of Verein Kirche von Arkhelle]]
7849e25912820b8784bbdbe253b3445a9057b7e4
Ioun
0
33
38
2024-03-25T01:04:45Z
Vicht
1
Created page with "The <b>Knowing Mistress</b>, goddess of Knowledge and Prophecy. One of the twelve gods of [[Verein Kirche von Arkhelle]]. Often depicted in deep blue and bright fuschia, she has olive skin, silvered hair and a third eye in the middle of her forehead. All her eyes glow purple. [[Category:Gods of Verein Kirche von Arkhelle]]"
wikitext
text/x-wiki
The <b>Knowing Mistress</b>, goddess of Knowledge and Prophecy. One of the twelve gods of [[Verein Kirche von Arkhelle]]. Often depicted in deep blue and bright fuschia, she has olive skin, silvered hair and a third eye in the middle of her forehead. All her eyes glow purple.
[[Category:Gods of Verein Kirche von Arkhelle]]
3588a9901d74c74437ca8ee1e48e20754c327779
Kord
0
34
39
2024-03-25T01:06:00Z
Vicht
1
Created page with "God of War and Battle. One of the twelve gods of [[Verein Kirche von Arkhelle]]. Often depicted in blood reds. [[Category:Gods of Verein Kirche von Arkhelle]]"
wikitext
text/x-wiki
God of War and Battle. One of the twelve gods of [[Verein Kirche von Arkhelle]]. Often depicted in blood reds.
[[Category:Gods of Verein Kirche von Arkhelle]]
f849981e168cb5c0b0b09068b150206ea011ffb0
Moradin
0
35
40
2024-03-25T01:07:52Z
Vicht
1
Created page with "God of the Forge and of Dwarves. One of the twelve gods of [[Verein Kirche von Arkhelle]]. Dwarven god, statues of whom could be found inside [[Droghen's keep]]. [[Grokko]] retrieved a [[firebreathing potion]] from one such statue. Depicted with a fiery red beard working the forge. [[Category:Gods of Verein Kirche von Arkhelle]] [[Category:Dwarves]]"
wikitext
text/x-wiki
God of the Forge and of Dwarves. One of the twelve gods of [[Verein Kirche von Arkhelle]]. Dwarven god, statues of whom could be found inside [[Droghen's keep]]. [[Grokko]] retrieved a [[firebreathing potion]] from one such statue. Depicted with a fiery red beard working the forge.
[[Category:Gods of Verein Kirche von Arkhelle]]
[[Category:Dwarves]]
b8b91576b96264ea557b44914e236c751aaa279d
41
40
2024-03-25T01:08:45Z
Vicht
1
Added link to Dwarf
wikitext
text/x-wiki
God of the Forge and of [[Dwarf|Dwarves]]. One of the twelve gods of [[Verein Kirche von Arkhelle]]. Dwarven god, statues of whom could be found inside [[Droghen's keep]]. [[Grokko]] retrieved a [[firebreathing potion]] from one such statue. Depicted with a fiery red beard working the forge.
[[Category:Gods of Verein Kirche von Arkhelle]]
[[Category:Dwarves]]
15d836fc4af84a7d0f4de682114a4fa3fb74edd9
Pelor
0
36
42
2024-03-25T01:19:54Z
Vicht
1
Created page with "The <b>Dawn Father</b>, goddess of the Sun. One of the twelve gods of [[Verein Kirche von Arkhelle]]. Golden skinned and often depicted in golden yellows and bright oranges. Worshipped by the woman who was rescued from the [[manticore]] attacking the windmill north of [[Havenhaft]]. [[Category:Gods of Verein Kirche von Arkhelle]]"
wikitext
text/x-wiki
The <b>Dawn Father</b>, goddess of the Sun. One of the twelve gods of [[Verein Kirche von Arkhelle]]. Golden skinned and often depicted in golden yellows and bright oranges. Worshipped by the woman who was rescued from the [[manticore]] attacking the windmill north of [[Havenhaft]].
[[Category:Gods of Verein Kirche von Arkhelle]]
16c205b832a9eb038f07dfec01a8f5fcb884a0bb
Selune
0
37
43
2024-03-25T01:33:06Z
Vicht
1
Created page with "The <b>Silver Crescent</b>, goddess of the Moon and the Night Sky. One of the twelve gods of [[Verein Kirche von Arkhelle]]. Represented by an [[elf|elven]] figure in dark blue robes, as well as by twilight purple colours. The moon of [[Talyen]] is called [[Asíl]]. [[Category:Gods of Verein Kirche von Arkhelle]] [[Category:Elves]]"
wikitext
text/x-wiki
The <b>Silver Crescent</b>, goddess of the Moon and the Night Sky. One of the twelve gods of [[Verein Kirche von Arkhelle]]. Represented by an [[elf|elven]] figure in dark blue robes, as well as by twilight purple colours. The moon of [[Talyen]] is called [[Asíl]].
[[Category:Gods of Verein Kirche von Arkhelle]]
[[Category:Elves]]
8e27c679a189f9b2891b2df0578e39157b31326f
Kereskaa
0
38
44
2024-03-25T01:34:02Z
Vicht
1
Redirected page to [[Mystra]]
wikitext
text/x-wiki
#REDIRECT [[Mystra]]
b3eb96de8cac8afec2541f92a1e869e6f94e3ae2
Mira
0
39
45
2024-03-25T18:33:32Z
Vicht
1
Created page with "<dfn><b>Mirark</b></dfn> is a [[tiefling]] [[warlock]] who joined [[Grokko]], [[Kham]] and [[Vichthart]] in investigating the deaths and disappearances of multiple people in [[Kaarst]]. He is 1.70 m tall, with white skin, purple hair and yellow eyes, and usually goes by the shorter name <b>Mira</b>. He has the traditional horns and classic devilish tail of a tiefling, although he keeps these hidden under his robes. His new friends often jokingly refer to him as a catboy,..."
wikitext
text/x-wiki
<dfn><b>Mirark</b></dfn> is a [[tiefling]] [[warlock]] who joined [[Grokko]], [[Kham]] and [[Vichthart]] in investigating the deaths and disappearances of multiple people in [[Kaarst]]. He is 1.70 m tall, with white skin, purple hair and yellow eyes, and usually goes by the shorter name <b>Mira</b>. He has the traditional horns and classic devilish tail of a tiefling, although he keeps these hidden under his robes. His new friends often jokingly refer to him as a catboy, despite not actually having any feline features. When Vichthart first met Mira, being slightly tipsy and having recently fought demons on [[Zaheer island|an island]], he asked his friends why there was a demon with them.
Mira comes from the far away country of [[Dhintay]], although only Grokko has been told its name. Nearly one decade ago he lost someone important to him, another tiefling who was taken from their home against their will. After receiving a tip to find ‘[[The Tide]]’, he travelled to Kaarst where he was ambushed by a gang of seven [[human]]s who tried to fleece him for his money and valuables. They were easily scared away or knocked unconscious by his powerful arcane magic, but it attracted the attention of Grokko and Kham, who warned him not to let his magic be known publicly in this city. They took him back with them to [[The Copper Roost]] to meet Vichthart, and after learning that they were all looking for missing persons, decided to work together.
Mira's magical powers are granted by his patron, [[Etaf]], a being who is bound to the inside of a gold ring that Mira wears, and can occasionally retreat inside. Etaf wants him to find who imprisoned him in the ring so he can be free, and has advised him to begin by finding out more about the people Mira took the ring from. He has also pointed out to Mira that his new friends do not yet trust him, and he would be wise to do more to win them over. Immediately after this, Mira spent the day trying to be as close and kind to Kham as possible, who he perceived as the most hostile of his new accomplices, all to Kham's infuriation. As well as somehow entering the ring, Mira has also shown the abilities to black out a large area, levitate, to teleport himself and another a short distance, and to fire [[eldritch blast]]s.
Mira also has an extraordinary ability to move about undetected, which the party has encouraged him to do at certain times, but he has also tended to do this while separating from them unannounced, resulting in their confusion and frustration. He also has a habit of taking anything he can for himself, including items from [[Kobolwitz Manor]], a crime scene they were investigating under official instructions. Sometimes these behaviours have backfired, as Mira has been attacked by a [[mimic]] and been injured by trapped mechanisms, as well as received significant criticism from his companions. When he asked if he could take items from [[Irann Rhogar]]'s [[Irann Rhogar's house]], however, [[Sable Warden Meriele Berevan]] remarked with the slightest of grins that it would be appropriate to use [[candlestick|his wealth]] to try to stop him. He has also successfully detected a hidden passageway underneath [[Squall's Beacon]], hurried the party unseen through the back alleys of Kaarst, and distracted [[devil]] guards by talking to them in their native infernal language.
[[Vastren]] showed interest in Mira, noticing that his bloodline was not like that of the [[human]]s and [[elf|elves]] she'd met. She called him a liar when he gave his name as ‘Mirark’, only believing him when he gave his name as ‘<b>Arkmir</b>’. Only Vichthart overheard this, and has not mentioned it to anyone. Conversely, only Mira was with Kham when he met and talked with [[Elira Lein]], who called him ‘Anrel’ and was surprised to realize he'd been using the pseudonym ‘Kham’, the name of a [[Real Kham|mutual acquaintance]]. He has promised Kham not to mention any part of the conversation to anyone else.
[[Category:Characters played by Erik]]
[[Category:Warlocks]]
[[Category:Tieflings]]
9ea7beae614842137519cd6d5680a90d49cec85d
Module:List
828
55
69
2024-03-25T20:47:10Z
wikipedia>Bbb23
0
Undid revision [[Special:Diff/1215553431|1215553431]] by [[Special:Contributions/Pppery|Pppery]] ([[User talk:Pppery|talk]]) this seems to have introduced an error at [[Wikipedia:About]]
Scribunto
text/plain
local libUtil = require('libraryUtil')
local checkType = libUtil.checkType
local mTableTools = require('Module:TableTools')
local p = {}
local listTypes = {
['bulleted'] = true,
['unbulleted'] = true,
['horizontal'] = true,
['ordered'] = true,
['horizontal_ordered'] = true
}
function p.makeListData(listType, args)
-- Constructs a data table to be passed to p.renderList.
local data = {}
-- Classes and TemplateStyles
data.classes = {}
data.templatestyles = ''
if listType == 'horizontal' or listType == 'horizontal_ordered' then
table.insert(data.classes, 'hlist')
data.templatestyles = mw.getCurrentFrame():extensionTag{
name = 'templatestyles', args = { src = 'Hlist/styles.css' }
}
elseif listType == 'unbulleted' then
table.insert(data.classes, 'plainlist')
data.templatestyles = mw.getCurrentFrame():extensionTag{
name = 'templatestyles', args = { src = 'Plainlist/styles.css' }
}
end
table.insert(data.classes, args.class)
-- Main div style
data.style = args.style
-- Indent for horizontal lists
if listType == 'horizontal' or listType == 'horizontal_ordered' then
local indent = tonumber(args.indent)
indent = indent and indent * 1.6 or 0
if indent > 0 then
data.marginLeft = indent .. 'em'
end
end
-- List style types for ordered lists
-- This could be "1, 2, 3", "a, b, c", or a number of others. The list style
-- type is either set by the "type" attribute or the "list-style-type" CSS
-- property.
if listType == 'ordered' or listType == 'horizontal_ordered' then
data.listStyleType = args.list_style_type or args['list-style-type']
data.type = args['type']
-- Detect invalid type attributes and attempt to convert them to
-- list-style-type CSS properties.
if data.type
and not data.listStyleType
and not tostring(data.type):find('^%s*[1AaIi]%s*$')
then
data.listStyleType = data.type
data.type = nil
end
end
-- List tag type
if listType == 'ordered' or listType == 'horizontal_ordered' then
data.listTag = 'ol'
else
data.listTag = 'ul'
end
-- Start number for ordered lists
data.start = args.start
if listType == 'horizontal_ordered' then
-- Apply fix to get start numbers working with horizontal ordered lists.
local startNum = tonumber(data.start)
if startNum then
data.counterReset = 'listitem ' .. tostring(startNum - 1)
end
end
-- List style
-- ul_style and ol_style are included for backwards compatibility. No
-- distinction is made for ordered or unordered lists.
data.listStyle = args.list_style
-- List items
-- li_style is included for backwards compatibility. item_style was included
-- to be easier to understand for non-coders.
data.itemStyle = args.item_style or args.li_style
data.items = {}
for _, num in ipairs(mTableTools.numKeys(args)) do
local item = {}
item.content = args[num]
item.style = args['item' .. tostring(num) .. '_style']
or args['item_style' .. tostring(num)]
item.value = args['item' .. tostring(num) .. '_value']
or args['item_value' .. tostring(num)]
table.insert(data.items, item)
end
return data
end
function p.renderList(data)
-- Renders the list HTML.
-- Return the blank string if there are no list items.
if type(data.items) ~= 'table' or #data.items < 1 then
return ''
end
-- Render the main div tag.
local root = mw.html.create('div')
for _, class in ipairs(data.classes or {}) do
root:addClass(class)
end
root:css{['margin-left'] = data.marginLeft}
if data.style then
root:cssText(data.style)
end
-- Render the list tag.
local list = root:tag(data.listTag or 'ul')
list
:attr{start = data.start, type = data.type}
:css{
['counter-reset'] = data.counterReset,
['list-style-type'] = data.listStyleType
}
if data.listStyle then
list:cssText(data.listStyle)
end
-- Render the list items
for _, t in ipairs(data.items or {}) do
local item = list:tag('li')
if data.itemStyle then
item:cssText(data.itemStyle)
end
if t.style then
item:cssText(t.style)
end
item
:attr{value = t.value}
:wikitext(t.content)
end
return data.templatestyles .. tostring(root)
end
function p.renderTrackingCategories(args)
local isDeprecated = false -- Tracks deprecated parameters.
for k, v in pairs(args) do
k = tostring(k)
if k:find('^item_style%d+$') or k:find('^item_value%d+$') then
isDeprecated = true
break
end
end
local ret = ''
if isDeprecated then
ret = ret .. '[[Category:List templates with deprecated parameters]]'
end
return ret
end
function p.makeList(listType, args)
if not listType or not listTypes[listType] then
error(string.format(
"bad argument #1 to 'makeList' ('%s' is not a valid list type)",
tostring(listType)
), 2)
end
checkType('makeList', 2, args, 'table')
local data = p.makeListData(listType, args)
local list = p.renderList(data)
local trackingCategories = p.renderTrackingCategories(args)
return list .. trackingCategories
end
for listType in pairs(listTypes) do
p[listType] = function (frame)
local mArguments = require('Module:Arguments')
local origArgs = mArguments.getArgs(frame, {
valueFunc = function (key, value)
if not value or not mw.ustring.find(value, '%S') then return nil end
if mw.ustring.find(value, '^%s*[%*#;:]') then
return value
else
return value:match('^%s*(.-)%s*$')
end
return nil
end
})
-- Copy all the arguments to a new table, for faster indexing.
local args = {}
for k, v in pairs(origArgs) do
args[k] = v
end
return p.makeList(listType, args)
end
end
return p
7a4f36a6e9cd56370bdd8207d23694124821dc1a
Mystra
0
40
47
2024-03-25T21:37:31Z
Vicht
1
Created page with "The <b>Seven Stars</b>, goddess of Magic. One of the twelve gods of [[Verein Kirche von Arkhelle]]. Her current name of <b>Mystra</b> was used by some tribes of [[human]]s back in the [[Age of Enlightenment]] when her worshippers and students in the [[Acropolis of Kereskaa]] called her <b>Kereskaa</b>. Her symbol is that of seven stars, referencing the schools of magic, and the phrase is referenced often in writings about her. On the wall of [[Irann Rhogar]]'s house, th..."
wikitext
text/x-wiki
The <b>Seven Stars</b>, goddess of Magic. One of the twelve gods of [[Verein Kirche von Arkhelle]]. Her current name of <b>Mystra</b> was used by some tribes of [[human]]s back in the [[Age of Enlightenment]] when her worshippers and students in the [[Acropolis of Kereskaa]] called her <b>Kereskaa</b>.
Her symbol is that of seven stars, referencing the schools of magic, and the phrase is referenced often in writings about her. On the wall of [[Irann Rhogar]]'s house, the words ‘Petty tyrants of lesser gods will not stop us. Seven stars will burn bright this night.’ were written in the blood of two [[Raven Guard]]s. In the amphitheatre of the Acropolis of Kereskaa, the phrases ‘Seven stars light the night sky’, ‘Seven eyes perceive what hides’, and the partial phrases beginning ‘Seven hearts yearn for—’ and ‘Seven stars and seven—’ are carved in the walls in a language [[Mira]] doesn't recognize.
According to [[Suithrathus Luirmo]], Master of [[Divination]], Kereskaa and her most devoted students built the Acropolis to hide and secure the [[Dragon Orb of Drimysthonantas]], said to be able to control [[dragon|black dragons]] supposedly because it contains the soul of a [[Great Wyrm]] from the [[History|Age of Great Ruin]].
== Knives of Mystra ==
As arcane magic is forbidden in [[Kaarst]], where the other gods of Verein Kirche have stained glass windows in [[Kade Sirrine Kathedrale]], Mystra's window is blank, although there are a very few offerings on the altar beneath it. According to [[Uthan]], anyone who openly worships Mystra is followed and searched by members of the church or [[Kaarst City Watch]], and so those who do worship her do so in secret, calling themselves the [[Knives of Mystra]]. When asking about the history of this law, [[Father Glissan]] tells [[Vichthart]] the following.
<blockquote>‘Yes, Kaarst has some unpleasant history with the arcane, dates back to the [[History|Age of Decadence]]. When it joined the [[Arkhellen Empire|Empire]], the churches were united, some exceptions were made to allow the city to maintain its laws banning arcane practice. The worship of Mystra is not outlawed, the arcane practices are.</blockquote>
[[The Tide]] doesn't seem to think the Knives take part in anything dangerous, although some members led by the [[Ashmaker]] do attack [[Kham]] and [[Vichthart]] in the street at night, according to [[Reiner Hoss]], to make a public demonstration. During this attack, the Ashmaker cried out ‘Let it be known, the Faithful of Mystra will no longer be denied in this city,’ with witnesses clearly hearing the mention of Mystra and talking about it afterwards. On the pretense of helping to liberate the worshippers of Mystra, [[Etorn Hadaran]] and [[Irann Rhogar]] convinced members of the Knives to plant masses of explosive [[ashfire oil]] in a certain position underneath Kaarst, to be detonated at sunset on [[Calendar|15th Thelliea]], the same night that Rhogar was due to take part in a meeting of [[Kaarst City Council]].
[[Category:Gods of Verein Kirche von Arkhelle]]
636fb28e4d681f8b797a1395d29d048be43a5907
Raven Queen
0
41
48
2024-03-25T22:13:17Z
Vicht
1
Created page with "The <b>Winter's Maiden</b>, goddess of Death, Winter and Fate. One of the twelve gods of [[Verein Kirche von Arkhelle]]. Depicted as a woman with a porcelain face dressed all in black. Her stained glass window in [[Kade Sirrine Kathedrale]] is the only one not to feature any bright colours, only black with small details in dark blue and crimson. [[Sable Warden Meriele Berevan]] is a leading cleric of the <b>Raven Queen</b>, based in [[Kaarst]], where there is a relativel..."
wikitext
text/x-wiki
The <b>Winter's Maiden</b>, goddess of Death, Winter and Fate. One of the twelve gods of [[Verein Kirche von Arkhelle]]. Depicted as a woman with a porcelain face dressed all in black. Her stained glass window in [[Kade Sirrine Kathedrale]] is the only one not to feature any bright colours, only black with small details in dark blue and crimson. [[Sable Warden Meriele Berevan]] is a leading cleric of the <b>Raven Queen</b>, based in [[Kaarst]], where there is a relatively high proportion of worshippers of the Raven Queen.
[[Thodris Holderheck]]'s mutilated remains were found below the largest statue of the Raven Queen in the [[Sombre Lyceum]], located in the north of the grounds. It is carved from black marble and depicts her shrouded in robes and wearing a deep hood, her face obscured by an expressionless yet somehow plaintive mask. A raven is perched on her right shoulder, and she is holding her hands out in front of her as if in prayer. The body of Thodris was arranged to mimic this pose.
It was only when [[Galesong Thervan Indále]] described this crime scene to [[Vichthart]] that the Sable Warden stopped silently looking out the window and turned to describe it as a travesty. The Raven Queen's followers particularly abhor murder and even more so [[necromancy]], seeing them as perversions of a person's natural fate. It was for this reason that Vichthart only felt comfortable trusting his potentially controversial findings with Meriele Berevan, who he knew would take a stern view of the presence of [[undead]] in Kaarrst.
According to the Sable Warden, the Raven Queen's origins go back to some time before the [[Great War]], when arcane magic was practised everywhere in the [[Material Plane]]. She began as a mortal woman and a powerful arcane mage who discovered the secrets to rise to godhood. She further adds that she is a god of magic who has grown in power over the years, who tends to attract those who are similar to her. Shortly before activating the circle of teleportation that takes the party to the [[Acropolis of Kereskaa]], the Sable Warden observes them carefully and makes the following comment.
<blockquote>Part of the purview of the Raven Queen is fate. How strange she would send such an eclectic group as yours. Pray that you do not fail.</blockquote>
[[Category:Gods of Verein Kirche von Arkhelle]]
72de7ea862f521e18bc832000ac40599afad4d12
MediaWiki:Common.css
8
42
49
2024-03-25T22:30:54Z
Vicht
1
Added #p-logo and #p-logo a
css
text/css
/* CSS placed here will be applied to all skins */
#p-logo {
height: 16.25em;
}
#p-logo a {
height: 16.25em;
background-size: 100%;
}
d998c48f8bcda1eada27f0766d50aaa4d6a5c14a
Zaheer
0
43
50
2024-03-25T23:33:12Z
Vicht
1
Created page with "The <b>Raging Tempest</b>, the <b>Mercurial Master of the Tempest</b>, god of Storm and Sea, known well to all who encounter storms in their travels. One of the twelve gods of [[Verein Kirche von Arkhelle]]. They have many depictions including male, female, and genderless, but they are consistently wrapped in shawls and robes, with long hair, all caught up in a wind. Depicted in colours of seagreen and deep grey and blue, frequently described as having great wings like a..."
wikitext
text/x-wiki
The <b>Raging Tempest</b>, the <b>Mercurial Master of the Tempest</b>, god of Storm and Sea, known well to all who encounter storms in their travels. One of the twelve gods of [[Verein Kirche von Arkhelle]]. They have many depictions including male, female, and genderless, but they are consistently wrapped in shawls and robes, with long hair, all caught up in a wind. Depicted in colours of seagreen and deep grey and blue, frequently described as having great wings like a roc, or carrying a great stave of dark wood. <b>Zaheer</b> is known to be quite mercurial, and is prayed to for safe passage over the seas, but commands their followers to be resilient and devout.
When the party begins travelling to [[Senneborn]] to prevent any more ships attempting to approach [[Meeresdorf]], [[Vichthart]] asks [[Sarenrae]] to keep Zaheer protective of the waters to prevent any further shipwrecks while they travel. It later turns out the [[Zaheer island|island]] that [[Szegha Silthallow]] and [[Rrekkeh Stormcrawler]] are operating from used to house a temple to Zaheer built into the mountain. The [[gnoll]]s corrupt it using [[demon]]ic powers to create the unnatural storms. With the help of [[Kylian]] and the [[throat]]s, the party puts a stop to this.
Along with [[Bahamut]] and the [[Raven Queen]], their church is strongly represented in [[Kaarst]], including by [[Galesong Thervan Indále]], one of the leading clerics at [[Kade Sirrine Kathedrale]]. [[Squall's Beacon]] is dedicated to Zaheer, and their followers volunteer and pay respects there throughout the night. Volunteers there include devout dockworker [[Eurgaran Wihta]] (deceased) and [[Amnon Ingolidan]], as well as secret vampire [[Eldon Garrick]].
== Kham ==
When the party tours Squall's Beacon, [[Kham]] looks into the light of the beacon and registers it as cool and softly comforting, despite recognizing it as powerful magic. When the others head into the basement (and [[Mira]] discovers a section of hollow floor), Kham remains on the ground level and pays his respects to Zaheer, unseen by his friends.
When a sting by the [[bone devil]] fills Kham's body with poison and he falls unconscious underwater, he sees a flash of light above and swims upwards to find himself in a dark, endless ocean, the sky above him black and filled with thundering storm clouds. A voice carried by the wind asks him ‘You have called out to me, and now me to you. Who are you?’ and he answers ‘Anrel’. He swims against the current towards a small rocky island with a thin, gnarled tree covered in tattered cloth. As he looks up, the tree is replaced by a figure covered in shawls and long, white hair, streaming in the wind but unflinching. It asks him ‘Why do you fight?’, to which Kham answers ‘To protect. For justice.’
When Kham reaches the rocky shore, the figure is stood at the pinnacle of the island, it features seeming to change whenever a strand of cloth or hair blows in front of it, but they have wild and mad eyes like a goat's, black with white irises that seem to carry energy. It asks him ‘The strength to weather storms is not given, but earnt. Are you worthy?’ Kham answers, ‘I guess I'll have to prove myself,’ and reaches for the figure's hand. He sees that it is covered in scars and tattoos in patterns of scattered waves and swirling wind, constantly shifting under its skin. When it next speaks, it's voice doesn't come from its lips but as a deep cracking of thunder that drowns out the surrounding noise: ‘Then prove it.’
When [[Grokko]] pulls Kham to the surface, his armour is sparkling with electric energy, and when his eyes flutter open, luminous wings of crackling lightning sprout from his back. From somewhere above the cavern, everyone hears a sound like a crack of thunder.
[[Category:Gods of Verein Kirche von Arkhelle]]
be9306322ffdf7823550d082dc792937ab7ec0a3
Template:Module rating
10
89
137
2024-03-26T07:30:47Z
wikipedia>Gonnym
0
consolidate category code and disable categories for user sandboxes
wikitext
text/x-wiki
<includeonly>{{#ifeq:{{SUBPAGENAME}}|doc|<!--do not show protection level of the module on the doc page, use the second and optionally third parameter if the doc page is also protected -->{{#if:{{{2|}}}|{{Pp|{{{2}}}|action={{{3|}}}}}}}|{{Module other|{{ombox
| type = notice
| image = {{#switch: {{{1|}}}
| pre-alpha | prealpha | pa = [[File:Ambox warning blue construction.svg|40x40px|link=|alt=Pre-alpha]]
| alpha | a = [[File:Greek lc alpha icon.svg|26x26px|link=|alt=Alpha]]
| beta | b = [[File:Greek lc beta icon.svg|40x40px|link=|alt=Beta]]
| release | r | general | g = [[File:Green check.svg|40x40px|link=|alt=Ready for use]]
| protected | protect | p = [[File:{{#switch:{{#invoke:Effective protection level|edit|{{#switch:{{SUBPAGENAME}}|doc|sandbox={{FULLBASEPAGENAME}}|{{FULLPAGENAME}}}}}}|autoconfirmed=Semi|extendedconfirmed=Extended|accountcreator|templateeditor=Template|#default=Full}}-protection-shackle.svg|40x40px|link=|alt=Protected]]
| semiprotected | semiprotect | semi =[[File:Semi-protection-shackle.svg|40x40px|link=|alt=Semi-protected]]
}}
| style =
| textstyle =
| text = {{#switch: {{{1|}}}
| pre-alpha | prealpha | pa = This module is rated as [[:Category:Modules in pre-alpha development|pre-alpha]]. It is unfinished, and may or may not be in active development. It should not be used from article namespace pages. Modules remain pre-alpha until the original editor (or someone who takes one over if it is abandoned for some time) is satisfied with the basic structure.
| alpha | a = This module is rated as [[:Category:Modules in alpha|alpha]]. It is ready for third-party input, and may be used on a few pages to see if problems arise, but should be watched. Suggestions for new features or changes in their input and output mechanisms are welcome.
| beta | b = This module is rated as [[:Category:Modules in beta|beta]], and is ready for widespread use. It is still new and should be used with some caution to ensure the results are as expected.
| release | r | general | g = This module is rated as [[:Category:Modules for general use|ready for general use]]. It has reached a mature form and is thought to be relatively bug-free and ready for use wherever appropriate. It is ready to mention on help pages and other Wikipedia resources as an option for new users to learn. To reduce server load and bad output, it should be improved by [[Wikipedia:Template sandbox and test cases|sandbox testing]] rather than repeated trial-and-error editing.
| protected | protect | p = This module is [[:Category:Modules subject to page protection|subject to page protection]]. It is a [[Wikipedia:High-risk templates|highly visible module]] in use by a very large number of pages, or is [[Wikipedia:Substitution|substituted]] very frequently. Because vandalism or mistakes would affect many pages, and even trivial editing might cause substantial load on the servers, it is [[Wikipedia:Protection policy|protected]] from editing.
| semiprotected | semiprotect | semi = This module is [[:Category:Modules subject to page protection|subject to page protection]]. It is a [[Wikipedia:High-risk templates|highly visible module]] in use by a very large number of pages, or is [[Wikipedia:Substitution|substituted]] very frequently. Because vandalism or mistakes would affect many pages, and even trivial editing might cause substantial load on the servers, it is [[WP:SEMI|semi-protected]] from editing.
| #default = {{error|Module rating is invalid or not specified.}}
}}
}}<!--
-->{{#ifeq: {{ROOTPAGENAME}} | Sandbox
| <!-- No category for user sandboxes -->
| {{#switch: {{SUBPAGENAME}}
| doc | sandbox =<!-- No category for /doc or /sandbox subpages -->
| {{#ifeq: {{{nocat|}}} | true
| <!-- No category if user sets nocat=true -->
| {{#switch: {{{1|}}}
| pre-alpha | prealpha | pa = [[Category:Modules in pre-alpha development|{{PAGENAME}}]]
| alpha | a = [[Category:Modules in alpha|{{PAGENAME}}]]
| beta | b = [[Category:Modules in beta|{{PAGENAME}}]]
| release | r | general | g = [[Category:Modules for general use|{{PAGENAME}}]]
| protected | protect | p = [[Category:Modules subject to page protection|{{PAGENAME}}]]
| semiprotected | semiprotect | semi = [[Category:Modules subject to page protection|{{PAGENAME}}]]
}}
}}
}}
}}<!--
-->|{{error|Error: {{tl|Module rating}} must be placed in the Module namespace.}} [[Category:Pages with templates in the wrong namespace]]|demospace={{{demospace|<noinclude>module</noinclude>}}}}}}}<!--
--></includeonly><noinclude>
{{module rating|release|nocat=true|demospace=module}}
{{documentation}}
<!-- Categories go on the /doc subpage, and interwikis go in Wikidata. -->
</noinclude>
75c928c417eb4da2a338898531fd8d501e05adbb
138
137
2024-03-26T22:30:09Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
<includeonly>{{#ifeq:{{SUBPAGENAME}}|doc|<!--do not show protection level of the module on the doc page, use the second and optionally third parameter if the doc page is also protected -->{{#if:{{{2|}}}|{{Pp|{{{2}}}|action={{{3|}}}}}}}|{{Module other|{{ombox
| type = notice
| image = {{#switch: {{{1|}}}
| pre-alpha | prealpha | pa = [[File:Ambox warning blue construction.svg|40x40px|link=|alt=Pre-alpha]]
| alpha | a = [[File:Greek lc alpha icon.svg|26x26px|link=|alt=Alpha]]
| beta | b = [[File:Greek lc beta icon.svg|40x40px|link=|alt=Beta]]
| release | r | general | g = [[File:Green check.svg|40x40px|link=|alt=Ready for use]]
| protected | protect | p = [[File:{{#switch:{{#invoke:Effective protection level|edit|{{#switch:{{SUBPAGENAME}}|doc|sandbox={{FULLBASEPAGENAME}}|{{FULLPAGENAME}}}}}}|autoconfirmed=Semi|extendedconfirmed=Extended|accountcreator|templateeditor=Template|#default=Full}}-protection-shackle.svg|40x40px|link=|alt=Protected]]
| semiprotected | semiprotect | semi =[[File:Semi-protection-shackle.svg|40x40px|link=|alt=Semi-protected]]
}}
| style =
| textstyle =
| text = {{#switch: {{{1|}}}
| pre-alpha | prealpha | pa = This module is rated as [[:Category:Modules in pre-alpha development|pre-alpha]]. It is unfinished, and may or may not be in active development. It should not be used from article namespace pages. Modules remain pre-alpha until the original editor (or someone who takes one over if it is abandoned for some time) is satisfied with the basic structure.
| alpha | a = This module is rated as [[:Category:Modules in alpha|alpha]]. It is ready for third-party input, and may be used on a few pages to see if problems arise, but should be watched. Suggestions for new features or changes in their input and output mechanisms are welcome.
| beta | b = This module is rated as [[:Category:Modules in beta|beta]], and is ready for widespread use. It is still new and should be used with some caution to ensure the results are as expected.
| release | r | general | g = This module is rated as [[:Category:Modules for general use|ready for general use]]. It has reached a mature form and is thought to be relatively bug-free and ready for use wherever appropriate. It is ready to mention on help pages and other Wikipedia resources as an option for new users to learn. To reduce server load and bad output, it should be improved by [[Wikipedia:Template sandbox and test cases|sandbox testing]] rather than repeated trial-and-error editing.
| protected | protect | p = This module is [[:Category:Modules subject to page protection|subject to page protection]]. It is a [[Wikipedia:High-risk templates|highly visible module]] in use by a very large number of pages, or is [[Wikipedia:Substitution|substituted]] very frequently. Because vandalism or mistakes would affect many pages, and even trivial editing might cause substantial load on the servers, it is [[Wikipedia:Protection policy|protected]] from editing.
| semiprotected | semiprotect | semi = This module is [[:Category:Modules subject to page protection|subject to page protection]]. It is a [[Wikipedia:High-risk templates|highly visible module]] in use by a very large number of pages, or is [[Wikipedia:Substitution|substituted]] very frequently. Because vandalism or mistakes would affect many pages, and even trivial editing might cause substantial load on the servers, it is [[WP:SEMI|semi-protected]] from editing.
| #default = {{error|Module rating is invalid or not specified.}}
}}
}}<!--
-->{{#ifeq: {{ROOTPAGENAME}} | Sandbox
| <!-- No category for user sandboxes -->
| {{#switch: {{SUBPAGENAME}}
| doc | sandbox =<!-- No category for /doc or /sandbox subpages -->
| {{#ifeq: {{{nocat|}}} | true
| <!-- No category if user sets nocat=true -->
| {{#switch: {{{1|}}}
| pre-alpha | prealpha | pa = [[Category:Modules in pre-alpha development|{{PAGENAME}}]]
| alpha | a = [[Category:Modules in alpha|{{PAGENAME}}]]
| beta | b = [[Category:Modules in beta|{{PAGENAME}}]]
| release | r | general | g = [[Category:Modules for general use|{{PAGENAME}}]]
| protected | protect | p = [[Category:Modules subject to page protection|{{PAGENAME}}]]
| semiprotected | semiprotect | semi = [[Category:Modules subject to page protection|{{PAGENAME}}]]
}}
}}
}}
}}<!--
-->|{{error|Error: {{tl|Module rating}} must be placed in the Module namespace.}} [[Category:Pages with templates in the wrong namespace]]|demospace={{{demospace|<noinclude>module</noinclude>}}}}}}}<!--
--></includeonly><noinclude>
{{module rating|release|nocat=true|demospace=module}}
{{documentation}}
<!-- Categories go on the /doc subpage, and interwikis go in Wikidata. -->
</noinclude>
75c928c417eb4da2a338898531fd8d501e05adbb
Sarenrae
0
44
51
2024-03-26T18:43:07Z
Vicht
1
Created page with "The <b>Dawn Flower</b>, goddess of Temperance, Patience, Compassion and Peace. One of the twelve gods of [[Verein Kirche von Arkhelle]]. She is a younger god of redeeming light and vengeful flame, whom neither [[Suithrathus Luirmo]] nor [[Vastren]] has heard of. Born during the [[Second Intervention]], Sarenrae teaches that those who can be redeemed should be guided on the path to salvation—and those who cannot repent their evil should be destroyed without remorse. She..."
wikitext
text/x-wiki
The <b>Dawn Flower</b>, goddess of Temperance, Patience, Compassion and Peace. One of the twelve gods of [[Verein Kirche von Arkhelle]]. She is a younger god of redeeming light and vengeful flame, whom neither [[Suithrathus Luirmo]] nor [[Vastren]] has heard of. Born during the [[Second Intervention]], Sarenrae teaches that those who can be redeemed should be guided on the path to salvation—and those who cannot repent their evil should be destroyed without remorse. She is depicted as a beautiful young [[human]] woman of bronze skin, with long golden braided hair that crackles with flame and angelic wings of iridescent gold. Her colours are golden yellow, fuschia and azure, and her symbols are a winged ankh, dove or phoenix of warm gold or fiery red.
[[Vichthart]] is a priest of Sarenrae, usually preaching and guiding his parishioners in his small home village in [[Arkhelle]]. He wears a pendant of Sarenrae around his neck, along with his [[Periapt of Wound Closure]], which he grasps and holds aloft whenever he invokes his god's power to dispell and destroy undead beings. He has known it to grow warm at times when Sarenrae has spoken to him. These times have been sparse: once, when he first entered the water from the sinking ship <i class="ship">[[The Crested Eagle]]</i>, compelling him to swim, and again when a voice in his ear persuaded him to unite the [[Feywild Shard]] with [[Grokko]]. Another survivor of <i class="ship">The Crested Eagle</i> to heed the call of Sarenrae was its former first mate, [[Lania Falst]], who began wearing her own pendant of Sarenrae in gratitude for surviving the shipwreck.
Vichthart's father, [[Decheimül Fezzilbahn]], is also a priest of Sarenrae, and was known to [[Cardinal Maurul Silkendawn]] by his reputation. [[Elias]] is a cleric of Sarenrae. A symbol of Sarenrae was discovered in the sewers of [[Senneborn]] after the party defeated the transparent [[gelatinous cube]].
[[Category:Gods of Verein Kirche von Arkhelle]]
[[Category:Humans]]
8477b4d280ac32cae9b1b4187da89fd9287fc27d
Mira
0
39
52
45
2024-03-26T19:20:10Z
Vicht
1
Fixed link to Irann Rhogar's house, added paragraph describing changes to Mira's body
wikitext
text/x-wiki
<dfn><b>Mirark</b></dfn> is a [[tiefling]] [[warlock]] who joined [[Grokko]], [[Kham]] and [[Vichthart]] in investigating the deaths and disappearances of multiple people in [[Kaarst]]. He is 1.70 m tall, with white skin, purple hair and yellow eyes, and usually goes by the shorter name <b>Mira</b>. He has the traditional horns and classic devilish tail of a tiefling, although he keeps these hidden under his robes. His new friends often jokingly refer to him as a catboy, despite not actually having any feline features. When Vichthart first met Mira, being slightly tipsy and having recently fought demons on [[Zaheer island|an island]], he asked his friends why there was a demon with them.
Mira comes from the far away country of [[Dhintay]], although only Grokko has been told its name. Nearly one decade ago he lost someone important to him, another tiefling who was taken from their home against their will. After receiving a tip to find ‘[[The Tide]]’, he travelled to Kaarst where he was ambushed by a gang of seven [[human]]s who tried to fleece him for his money and valuables. They were easily scared away or knocked unconscious by his powerful arcane magic, but it attracted the attention of Grokko and Kham, who warned him not to let his magic be known publicly in this city. They took him back with them to [[The Copper Roost]] to meet Vichthart, and after learning that they were all looking for missing persons, decided to work together.
Mira's magical powers are granted by his patron, [[Etaf]], a being who is bound to the inside of a gold ring that Mira wears, and can occasionally retreat inside. Etaf wants him to find who imprisoned him in the ring so he can be free, and has advised him to begin by finding out more about the people Mira took the ring from. He has also pointed out to Mira that his new friends do not yet trust him, and he would be wise to do more to win them over. Immediately after this, Mira spent the day trying to be as close and kind to Kham as possible, who he perceived as the most hostile of his new accomplices, all to Kham's infuriation. As well as somehow entering the ring, Mira has also shown the abilities to black out a large area, levitate, to teleport himself and another a short distance, and to fire [[eldritch blast]]s.
Mira also has an extraordinary ability to move about undetected, which the party has encouraged him to do at certain times, but he has also tended to do this while separating from them unannounced, resulting in their confusion and frustration. He also has a habit of taking anything he can for himself, including items from [[Kobolwitz Manor]], a crime scene they were investigating under official instructions. Sometimes these behaviours have backfired, as Mira has been attacked by a [[mimic]] and been injured by trapped mechanisms, as well as received significant criticism from his companions. When he asked if he could take items from [[Irann Rhogar]]'s [[Irann Rhogar's house|house]], however, [[Sable Warden Meriele Berevan]] remarked with the slightest of grins that it would be appropriate to use [[candlestick|his wealth]] to try to stop him. He has also successfully detected a hidden passageway underneath [[Squall's Beacon]], hurried the party unseen through the back alleys of Kaarst, and distracted [[devil]] guards by talking to them in their native infernal language.
[[Vastren]] showed interest in Mira, noticing that his bloodline was not like that of the [[human]]s and [[elf|elves]] she'd met. She called him a liar when he gave his name as ‘Mirark’, only believing him when he gave his name as ‘<b>Arkmir</b>’. Only Vichthart overheard this, and has not mentioned it to anyone. Conversely, only Mira was with Kham when he met and talked with [[Elira Lein]], who called him ‘Anrel’ and was surprised to realize he'd been using the pseudonym ‘Kham’, the name of a [[Real Kham|mutual acquaintance]]. He has promised Kham not to mention any part of the conversation to anyone else.
Mira's body was recently changed to present as female by a mirror contraption created by [[Toross Rhistel]], Master of [[Transmutation]] at the [[Acropolis of Kereskaa]], in the catacomb beneath the [[Spire of Transmutation]]. His body was also shrunken to the size of a halfling, although this reverted on its own. His body has remained female throughout his fight against the [[bone devil]].
[[Category:Characters played by Erik]]
[[Category:Warlocks]]
[[Category:Tieflings]]
7af966a385a70aab03712befa41a5abe965f6033
Template:Navbox
10
45
54
53
2024-03-26T21:29:53Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
<includeonly>{{#invoke:Navbox|navbox}}</includeonly><noinclude>
{{Documentation}}
</noinclude>
fe9b964401f895918ee4fe078678f1722a3c41ec
Template:Tl
10
49
59
58
2024-03-26T22:29:09Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
#REDIRECT [[Template:Template link]]
{{Redirect category shell|
{{R from move}}
}}
d6593bb3b4a866249f55d0f34b047a71fe1f1529
Template:Template link
10
50
61
60
2024-03-26T22:29:09Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
{{[[Template:{{{1}}}|{{{1}}}]]}}<noinclude>{{documentation}}
<!-- Categories go on the /doc subpage and interwikis go on Wikidata. -->
</noinclude>
eabbec62efe3044a98ebb3ce9e7d4d43c222351d
Module:Message box/configuration
828
52
64
63
2024-03-26T22:29:46Z
Vicht
1
1 revision imported
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Message box configuration --
-- --
-- This module contains configuration data for [[Module:Message box]]. --
--------------------------------------------------------------------------------
return {
ambox = {
types = {
speedy = {
class = 'ambox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'ambox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'ambox-content',
image = 'Ambox important.svg'
},
style = {
class = 'ambox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ambox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'ambox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'ambox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
allowBlankParams = {'talk', 'sect', 'date', 'issue', 'fix', 'subst', 'hidden'},
allowSmall = true,
smallParam = 'left',
smallClass = 'mbox-small-left',
substCheck = true,
classes = {'metadata', 'ambox'},
imageEmptyCell = true,
imageCheckBlank = true,
imageSmallSize = '20x20px',
imageCellDiv = true,
useCollapsibleTextFields = true,
imageRightNone = true,
sectionDefault = 'article',
allowMainspaceCategories = true,
templateCategory = 'Article message templates',
templateCategoryRequireName = true,
templateErrorCategory = 'Article message templates with missing parameters',
templateErrorParamsToCheck = {'issue', 'fix', 'subst'},
removalNotice = '<small>[[Help:Maintenance template removal|Learn how and when to remove this template message]]</small>',
templatestyles = 'Module:Message box/ambox.css'
},
cmbox = {
types = {
speedy = {
class = 'cmbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'cmbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'cmbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'cmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'cmbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'cmbox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'cmbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'cmbox'},
imageEmptyCell = true,
templatestyles = 'Module:Message box/cmbox.css'
},
fmbox = {
types = {
warning = {
class = 'fmbox-warning',
image = 'Ambox warning pn.svg'
},
editnotice = {
class = 'fmbox-editnotice',
image = 'Information icon4.svg'
},
system = {
class = 'fmbox-system',
image = 'Information icon4.svg'
}
},
default = 'system',
showInvalidTypeError = true,
classes = {'fmbox'},
imageEmptyCell = false,
imageRightNone = false,
templatestyles = 'Module:Message box/fmbox.css'
},
imbox = {
types = {
speedy = {
class = 'imbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'imbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'imbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'imbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'imbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'imbox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
license = {
class = 'imbox-license licensetpl',
image = 'Imbox-license.svg'
},
["license-related"] = {
class = 'imbox-license',
image = 'Imbox-license.svg'
},
featured = {
class = 'imbox-featured',
image = 'Cscr-featured.svg',
imageNeedsLink = true
},
notice = {
class = 'imbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'imbox'},
imageEmptyCell = true,
below = true,
templateCategory = 'File message boxes',
templatestyles = 'Module:Message box/imbox.css'
},
ombox = {
types = {
speedy = {
class = 'ombox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'ombox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'ombox-content',
image = 'Ambox important.svg'
},
style = {
class = 'ombox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'ombox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'ombox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'ombox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'ombox'},
allowSmall = true,
imageEmptyCell = true,
imageRightNone = true,
templatestyles = 'Module:Message box/ombox.css'
},
tmbox = {
types = {
speedy = {
class = 'tmbox-speedy',
image = 'Ambox warning pn.svg'
},
delete = {
class = 'tmbox-delete',
image = 'Ambox warning pn.svg'
},
content = {
class = 'tmbox-content',
image = 'Ambox important.svg'
},
style = {
class = 'tmbox-style',
image = 'Edit-clear.svg'
},
move = {
class = 'tmbox-move',
image = 'Merge-split-transwiki default.svg'
},
protection = {
class = 'tmbox-protection',
image = 'Semi-protection-shackle-keyhole.svg'
},
notice = {
class = 'tmbox-notice',
image = 'Information icon4.svg'
}
},
default = 'notice',
showInvalidTypeError = true,
classes = {'tmbox'},
allowSmall = true,
imageRightNone = true,
imageEmptyCell = true,
templateCategory = 'Talk message boxes',
templatestyles = 'Module:Message box/tmbox.css'
}
}
ccb6bdf2868087b6833d203307f2f6a92b3b0a01
Module:Redirect
828
53
66
65
2024-03-26T22:29:46Z
Vicht
1
1 revision imported
Scribunto
text/plain
-- This module provides functions for getting the target of a redirect page.
local p = {}
-- Gets a mw.title object, using pcall to avoid generating script errors if we
-- are over the expensive function count limit (among other possible causes).
local function getTitle(...)
local success, titleObj = pcall(mw.title.new, ...)
if success then
return titleObj
else
return nil
end
end
-- Gets the name of a page that a redirect leads to, or nil if it isn't a
-- redirect.
function p.getTargetFromText(text)
local target = string.match(
text,
"^%s*#[Rr][Ee][Dd][Ii][Rr][Ee][Cc][Tt]%s*:?%s*%[%[([^%[%]|]-)%]%]"
) or string.match(
text,
"^%s*#[Rr][Ee][Dd][Ii][Rr][Ee][Cc][Tt]%s*:?%s*%[%[([^%[%]|]-)|[^%[%]]-%]%]"
)
return target and mw.uri.decode(target, 'PATH')
end
-- Gets the target of a redirect. If the page specified is not a redirect,
-- returns nil.
function p.getTarget(page, fulltext)
-- Get the title object. Both page names and title objects are allowed
-- as input.
local titleObj
if type(page) == 'string' or type(page) == 'number' then
titleObj = getTitle(page)
elseif type(page) == 'table' and type(page.getContent) == 'function' then
titleObj = page
else
error(string.format(
"bad argument #1 to 'getTarget'"
.. " (string, number, or title object expected, got %s)",
type(page)
), 2)
end
if not titleObj then
return nil
end
local targetTitle = titleObj.redirectTarget
if targetTitle then
if fulltext then
return targetTitle.fullText
else
return targetTitle.prefixedText
end
else
return nil
end
end
--[[
-- Given a single page name determines what page it redirects to and returns the
-- target page name, or the passed page name when not a redirect. The passed
-- page name can be given as plain text or as a page link.
--
-- Returns page name as plain text, or when the bracket parameter is given, as a
-- page link. Returns an error message when page does not exist or the redirect
-- target cannot be determined for some reason.
--]]
function p.luaMain(rname, bracket, fulltext)
if type(rname) ~= "string" or not rname:find("%S") then
return nil
end
bracket = bracket and "[[%s]]" or "%s"
rname = rname:match("%[%[(.+)%]%]") or rname
local target = p.getTarget(rname, fulltext)
local ret = target or rname
ret = getTitle(ret)
if ret then
if fulltext then
ret = ret.fullText
else
ret = ret.prefixedText
end
return bracket:format(ret)
else
return nil
end
end
-- Provides access to the luaMain function from wikitext.
function p.main(frame)
local args = require('Module:Arguments').getArgs(frame, {frameOnly = true})
return p.luaMain(args[1], args.bracket, args.fulltext) or ''
end
-- Returns true if the specified page is a redirect, and false otherwise.
function p.luaIsRedirect(page)
local titleObj = getTitle(page)
if not titleObj then
return false
end
if titleObj.isRedirect then
return true
else
return false
end
end
-- Provides access to the luaIsRedirect function from wikitext, returning 'yes'
-- if the specified page is a redirect, and the blank string otherwise.
function p.isRedirect(frame)
local args = require('Module:Arguments').getArgs(frame, {frameOnly = true})
if p.luaIsRedirect(args[1]) then
return 'yes'
else
return ''
end
end
return p
a224c45940343d66f49a78b0a39b2045e2c45d20
Module:String
828
54
68
67
2024-03-26T22:29:46Z
Vicht
1
1 revision imported
Scribunto
text/plain
--[[
This module is intended to provide access to basic string functions.
Most of the functions provided here can be invoked with named parameters,
unnamed parameters, or a mixture. If named parameters are used, Mediawiki will
automatically remove any leading or trailing whitespace from the parameter.
Depending on the intended use, it may be advantageous to either preserve or
remove such whitespace.
Global options
ignore_errors: If set to 'true' or 1, any error condition will result in
an empty string being returned rather than an error message.
error_category: If an error occurs, specifies the name of a category to
include with the error message. The default category is
[Category:Errors reported by Module String].
no_category: If set to 'true' or 1, no category will be added if an error
is generated.
Unit tests for this module are available at Module:String/tests.
]]
local str = {}
--[[
len
This function returns the length of the target string.
Usage:
{{#invoke:String|len|target_string|}}
OR
{{#invoke:String|len|s=target_string}}
Parameters
s: The string whose length to report
If invoked using named parameters, Mediawiki will automatically remove any leading or
trailing whitespace from the target string.
]]
function str.len( frame )
local new_args = str._getParameters( frame.args, {'s'} )
local s = new_args['s'] or ''
return mw.ustring.len( s )
end
--[[
sub
This function returns a substring of the target string at specified indices.
Usage:
{{#invoke:String|sub|target_string|start_index|end_index}}
OR
{{#invoke:String|sub|s=target_string|i=start_index|j=end_index}}
Parameters
s: The string to return a subset of
i: The first index of the substring to return, defaults to 1.
j: The last index of the string to return, defaults to the last character.
The first character of the string is assigned an index of 1. If either i or j
is a negative value, it is interpreted the same as selecting a character by
counting from the end of the string. Hence, a value of -1 is the same as
selecting the last character of the string.
If the requested indices are out of range for the given string, an error is
reported.
]]
function str.sub( frame )
local new_args = str._getParameters( frame.args, { 's', 'i', 'j' } )
local s = new_args['s'] or ''
local i = tonumber( new_args['i'] ) or 1
local j = tonumber( new_args['j'] ) or -1
local len = mw.ustring.len( s )
-- Convert negatives for range checking
if i < 0 then
i = len + i + 1
end
if j < 0 then
j = len + j + 1
end
if i > len or j > len or i < 1 or j < 1 then
return str._error( 'String subset index out of range' )
end
if j < i then
return str._error( 'String subset indices out of order' )
end
return mw.ustring.sub( s, i, j )
end
--[[
This function implements that features of {{str sub old}} and is kept in order
to maintain these older templates.
]]
function str.sublength( frame )
local i = tonumber( frame.args.i ) or 0
local len = tonumber( frame.args.len )
return mw.ustring.sub( frame.args.s, i + 1, len and ( i + len ) )
end
--[[
_match
This function returns a substring from the source string that matches a
specified pattern. It is exported for use in other modules
Usage:
strmatch = require("Module:String")._match
sresult = strmatch( s, pattern, start, match, plain, nomatch )
Parameters
s: The string to search
pattern: The pattern or string to find within the string
start: The index within the source string to start the search. The first
character of the string has index 1. Defaults to 1.
match: In some cases it may be possible to make multiple matches on a single
string. This specifies which match to return, where the first match is
match= 1. If a negative number is specified then a match is returned
counting from the last match. Hence match = -1 is the same as requesting
the last match. Defaults to 1.
plain: A flag indicating that the pattern should be understood as plain
text. Defaults to false.
nomatch: If no match is found, output the "nomatch" value rather than an error.
For information on constructing Lua patterns, a form of [regular expression], see:
* http://www.lua.org/manual/5.1/manual.html#5.4.1
* http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Patterns
* http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Ustring_patterns
]]
-- This sub-routine is exported for use in other modules
function str._match( s, pattern, start, match_index, plain_flag, nomatch )
if s == '' then
return str._error( 'Target string is empty' )
end
if pattern == '' then
return str._error( 'Pattern string is empty' )
end
start = tonumber(start) or 1
if math.abs(start) < 1 or math.abs(start) > mw.ustring.len( s ) then
return str._error( 'Requested start is out of range' )
end
if match_index == 0 then
return str._error( 'Match index is out of range' )
end
if plain_flag then
pattern = str._escapePattern( pattern )
end
local result
if match_index == 1 then
-- Find first match is simple case
result = mw.ustring.match( s, pattern, start )
else
if start > 1 then
s = mw.ustring.sub( s, start )
end
local iterator = mw.ustring.gmatch(s, pattern)
if match_index > 0 then
-- Forward search
for w in iterator do
match_index = match_index - 1
if match_index == 0 then
result = w
break
end
end
else
-- Reverse search
local result_table = {}
local count = 1
for w in iterator do
result_table[count] = w
count = count + 1
end
result = result_table[ count + match_index ]
end
end
if result == nil then
if nomatch == nil then
return str._error( 'Match not found' )
else
return nomatch
end
else
return result
end
end
--[[
match
This function returns a substring from the source string that matches a
specified pattern.
Usage:
{{#invoke:String|match|source_string|pattern_string|start_index|match_number|plain_flag|nomatch_output}}
OR
{{#invoke:String|match|s=source_string|pattern=pattern_string|start=start_index
|match=match_number|plain=plain_flag|nomatch=nomatch_output}}
Parameters
s: The string to search
pattern: The pattern or string to find within the string
start: The index within the source string to start the search. The first
character of the string has index 1. Defaults to 1.
match: In some cases it may be possible to make multiple matches on a single
string. This specifies which match to return, where the first match is
match= 1. If a negative number is specified then a match is returned
counting from the last match. Hence match = -1 is the same as requesting
the last match. Defaults to 1.
plain: A flag indicating that the pattern should be understood as plain
text. Defaults to false.
nomatch: If no match is found, output the "nomatch" value rather than an error.
If invoked using named parameters, Mediawiki will automatically remove any leading or
trailing whitespace from each string. In some circumstances this is desirable, in
other cases one may want to preserve the whitespace.
If the match_number or start_index are out of range for the string being queried, then
this function generates an error. An error is also generated if no match is found.
If one adds the parameter ignore_errors=true, then the error will be suppressed and
an empty string will be returned on any failure.
For information on constructing Lua patterns, a form of [regular expression], see:
* http://www.lua.org/manual/5.1/manual.html#5.4.1
* http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Patterns
* http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Ustring_patterns
]]
-- This is the entry point for #invoke:String|match
function str.match( frame )
local new_args = str._getParameters( frame.args, {'s', 'pattern', 'start', 'match', 'plain', 'nomatch'} )
local s = new_args['s'] or ''
local start = tonumber( new_args['start'] ) or 1
local plain_flag = str._getBoolean( new_args['plain'] or false )
local pattern = new_args['pattern'] or ''
local match_index = math.floor( tonumber(new_args['match']) or 1 )
local nomatch = new_args['nomatch']
return str._match( s, pattern, start, match_index, plain_flag, nomatch )
end
--[[
pos
This function returns a single character from the target string at position pos.
Usage:
{{#invoke:String|pos|target_string|index_value}}
OR
{{#invoke:String|pos|target=target_string|pos=index_value}}
Parameters
target: The string to search
pos: The index for the character to return
If invoked using named parameters, Mediawiki will automatically remove any leading or
trailing whitespace from the target string. In some circumstances this is desirable, in
other cases one may want to preserve the whitespace.
The first character has an index value of 1.
If one requests a negative value, this function will select a character by counting backwards
from the end of the string. In other words pos = -1 is the same as asking for the last character.
A requested value of zero, or a value greater than the length of the string returns an error.
]]
function str.pos( frame )
local new_args = str._getParameters( frame.args, {'target', 'pos'} )
local target_str = new_args['target'] or ''
local pos = tonumber( new_args['pos'] ) or 0
if pos == 0 or math.abs(pos) > mw.ustring.len( target_str ) then
return str._error( 'String index out of range' )
end
return mw.ustring.sub( target_str, pos, pos )
end
--[[
str_find
This function duplicates the behavior of {{str_find}}, including all of its quirks.
This is provided in order to support existing templates, but is NOT RECOMMENDED for
new code and templates. New code is recommended to use the "find" function instead.
Returns the first index in "source" that is a match to "target". Indexing is 1-based,
and the function returns -1 if the "target" string is not present in "source".
Important Note: If the "target" string is empty / missing, this function returns a
value of "1", which is generally unexpected behavior, and must be accounted for
separatetly.
]]
function str.str_find( frame )
local new_args = str._getParameters( frame.args, {'source', 'target'} )
local source_str = new_args['source'] or ''
local target_str = new_args['target'] or ''
if target_str == '' then
return 1
end
local start = mw.ustring.find( source_str, target_str, 1, true )
if start == nil then
start = -1
end
return start
end
--[[
find
This function allows one to search for a target string or pattern within another
string.
Usage:
{{#invoke:String|find|source_str|target_string|start_index|plain_flag}}
OR
{{#invoke:String|find|source=source_str|target=target_str|start=start_index|plain=plain_flag}}
Parameters
source: The string to search
target: The string or pattern to find within source
start: The index within the source string to start the search, defaults to 1
plain: Boolean flag indicating that target should be understood as plain
text and not as a Lua style regular expression, defaults to true
If invoked using named parameters, Mediawiki will automatically remove any leading or
trailing whitespace from the parameter. In some circumstances this is desirable, in
other cases one may want to preserve the whitespace.
This function returns the first index >= "start" where "target" can be found
within "source". Indices are 1-based. If "target" is not found, then this
function returns 0. If either "source" or "target" are missing / empty, this
function also returns 0.
This function should be safe for UTF-8 strings.
]]
function str.find( frame )
local new_args = str._getParameters( frame.args, {'source', 'target', 'start', 'plain' } )
local source_str = new_args['source'] or ''
local pattern = new_args['target'] or ''
local start_pos = tonumber(new_args['start']) or 1
local plain = new_args['plain'] or true
if source_str == '' or pattern == '' then
return 0
end
plain = str._getBoolean( plain )
local start = mw.ustring.find( source_str, pattern, start_pos, plain )
if start == nil then
start = 0
end
return start
end
--[[
replace
This function allows one to replace a target string or pattern within another
string.
Usage:
{{#invoke:String|replace|source_str|pattern_string|replace_string|replacement_count|plain_flag}}
OR
{{#invoke:String|replace|source=source_string|pattern=pattern_string|replace=replace_string|
count=replacement_count|plain=plain_flag}}
Parameters
source: The string to search
pattern: The string or pattern to find within source
replace: The replacement text
count: The number of occurences to replace, defaults to all.
plain: Boolean flag indicating that pattern should be understood as plain
text and not as a Lua style regular expression, defaults to true
]]
function str.replace( frame )
local new_args = str._getParameters( frame.args, {'source', 'pattern', 'replace', 'count', 'plain' } )
local source_str = new_args['source'] or ''
local pattern = new_args['pattern'] or ''
local replace = new_args['replace'] or ''
local count = tonumber( new_args['count'] )
local plain = new_args['plain'] or true
if source_str == '' or pattern == '' then
return source_str
end
plain = str._getBoolean( plain )
if plain then
pattern = str._escapePattern( pattern )
replace = mw.ustring.gsub( replace, "%%", "%%%%" ) --Only need to escape replacement sequences.
end
local result
if count ~= nil then
result = mw.ustring.gsub( source_str, pattern, replace, count )
else
result = mw.ustring.gsub( source_str, pattern, replace )
end
return result
end
--[[
simple function to pipe string.rep to templates.
]]
function str.rep( frame )
local repetitions = tonumber( frame.args[2] )
if not repetitions then
return str._error( 'function rep expects a number as second parameter, received "' .. ( frame.args[2] or '' ) .. '"' )
end
return string.rep( frame.args[1] or '', repetitions )
end
--[[
escapePattern
This function escapes special characters from a Lua string pattern. See [1]
for details on how patterns work.
[1] https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Patterns
Usage:
{{#invoke:String|escapePattern|pattern_string}}
Parameters
pattern_string: The pattern string to escape.
]]
function str.escapePattern( frame )
local pattern_str = frame.args[1]
if not pattern_str then
return str._error( 'No pattern string specified' )
end
local result = str._escapePattern( pattern_str )
return result
end
--[[
count
This function counts the number of occurrences of one string in another.
]]
function str.count(frame)
local args = str._getParameters(frame.args, {'source', 'pattern', 'plain'})
local source = args.source or ''
local pattern = args.pattern or ''
local plain = str._getBoolean(args.plain or true)
if plain then
pattern = str._escapePattern(pattern)
end
local _, count = mw.ustring.gsub(source, pattern, '')
return count
end
--[[
endswith
This function determines whether a string ends with another string.
]]
function str.endswith(frame)
local args = str._getParameters(frame.args, {'source', 'pattern'})
local source = args.source or ''
local pattern = args.pattern or ''
if pattern == '' then
-- All strings end with the empty string.
return "yes"
end
if mw.ustring.sub(source, -mw.ustring.len(pattern), -1) == pattern then
return "yes"
else
return ""
end
end
--[[
join
Join all non empty arguments together; the first argument is the separator.
Usage:
{{#invoke:String|join|sep|one|two|three}}
]]
function str.join(frame)
local args = {}
local sep
for _, v in ipairs( frame.args ) do
if sep then
if v ~= '' then
table.insert(args, v)
end
else
sep = v
end
end
return table.concat( args, sep or '' )
end
--[[
Helper function that populates the argument list given that user may need to use a mix of
named and unnamed parameters. This is relevant because named parameters are not
identical to unnamed parameters due to string trimming, and when dealing with strings
we sometimes want to either preserve or remove that whitespace depending on the application.
]]
function str._getParameters( frame_args, arg_list )
local new_args = {}
local index = 1
local value
for _, arg in ipairs( arg_list ) do
value = frame_args[arg]
if value == nil then
value = frame_args[index]
index = index + 1
end
new_args[arg] = value
end
return new_args
end
--[[
Helper function to handle error messages.
]]
function str._error( error_str )
local frame = mw.getCurrentFrame()
local error_category = frame.args.error_category or 'Errors reported by Module String'
local ignore_errors = frame.args.ignore_errors or false
local no_category = frame.args.no_category or false
if str._getBoolean(ignore_errors) then
return ''
end
local error_str = '<strong class="error">String Module Error: ' .. error_str .. '</strong>'
if error_category ~= '' and not str._getBoolean( no_category ) then
error_str = '[[Category:' .. error_category .. ']]' .. error_str
end
return error_str
end
--[[
Helper Function to interpret boolean strings
]]
function str._getBoolean( boolean_str )
local boolean_value
if type( boolean_str ) == 'string' then
boolean_str = boolean_str:lower()
if boolean_str == 'false' or boolean_str == 'no' or boolean_str == '0'
or boolean_str == '' then
boolean_value = false
else
boolean_value = true
end
elseif type( boolean_str ) == 'boolean' then
boolean_value = boolean_str
else
error( 'No boolean value found' )
end
return boolean_value
end
--[[
Helper function that escapes all pattern characters so that they will be treated
as plain text.
]]
function str._escapePattern( pattern_str )
return mw.ustring.gsub( pattern_str, "([%(%)%.%%%+%-%*%?%[%^%$%]])", "%%%1" )
end
return str
2ad0905c56ef4955950b75a8f00974fe82aed5e4
Module:List
828
55
70
69
2024-03-26T22:29:46Z
Vicht
1
1 revision imported
Scribunto
text/plain
local libUtil = require('libraryUtil')
local checkType = libUtil.checkType
local mTableTools = require('Module:TableTools')
local p = {}
local listTypes = {
['bulleted'] = true,
['unbulleted'] = true,
['horizontal'] = true,
['ordered'] = true,
['horizontal_ordered'] = true
}
function p.makeListData(listType, args)
-- Constructs a data table to be passed to p.renderList.
local data = {}
-- Classes and TemplateStyles
data.classes = {}
data.templatestyles = ''
if listType == 'horizontal' or listType == 'horizontal_ordered' then
table.insert(data.classes, 'hlist')
data.templatestyles = mw.getCurrentFrame():extensionTag{
name = 'templatestyles', args = { src = 'Hlist/styles.css' }
}
elseif listType == 'unbulleted' then
table.insert(data.classes, 'plainlist')
data.templatestyles = mw.getCurrentFrame():extensionTag{
name = 'templatestyles', args = { src = 'Plainlist/styles.css' }
}
end
table.insert(data.classes, args.class)
-- Main div style
data.style = args.style
-- Indent for horizontal lists
if listType == 'horizontal' or listType == 'horizontal_ordered' then
local indent = tonumber(args.indent)
indent = indent and indent * 1.6 or 0
if indent > 0 then
data.marginLeft = indent .. 'em'
end
end
-- List style types for ordered lists
-- This could be "1, 2, 3", "a, b, c", or a number of others. The list style
-- type is either set by the "type" attribute or the "list-style-type" CSS
-- property.
if listType == 'ordered' or listType == 'horizontal_ordered' then
data.listStyleType = args.list_style_type or args['list-style-type']
data.type = args['type']
-- Detect invalid type attributes and attempt to convert them to
-- list-style-type CSS properties.
if data.type
and not data.listStyleType
and not tostring(data.type):find('^%s*[1AaIi]%s*$')
then
data.listStyleType = data.type
data.type = nil
end
end
-- List tag type
if listType == 'ordered' or listType == 'horizontal_ordered' then
data.listTag = 'ol'
else
data.listTag = 'ul'
end
-- Start number for ordered lists
data.start = args.start
if listType == 'horizontal_ordered' then
-- Apply fix to get start numbers working with horizontal ordered lists.
local startNum = tonumber(data.start)
if startNum then
data.counterReset = 'listitem ' .. tostring(startNum - 1)
end
end
-- List style
-- ul_style and ol_style are included for backwards compatibility. No
-- distinction is made for ordered or unordered lists.
data.listStyle = args.list_style
-- List items
-- li_style is included for backwards compatibility. item_style was included
-- to be easier to understand for non-coders.
data.itemStyle = args.item_style or args.li_style
data.items = {}
for _, num in ipairs(mTableTools.numKeys(args)) do
local item = {}
item.content = args[num]
item.style = args['item' .. tostring(num) .. '_style']
or args['item_style' .. tostring(num)]
item.value = args['item' .. tostring(num) .. '_value']
or args['item_value' .. tostring(num)]
table.insert(data.items, item)
end
return data
end
function p.renderList(data)
-- Renders the list HTML.
-- Return the blank string if there are no list items.
if type(data.items) ~= 'table' or #data.items < 1 then
return ''
end
-- Render the main div tag.
local root = mw.html.create('div')
for _, class in ipairs(data.classes or {}) do
root:addClass(class)
end
root:css{['margin-left'] = data.marginLeft}
if data.style then
root:cssText(data.style)
end
-- Render the list tag.
local list = root:tag(data.listTag or 'ul')
list
:attr{start = data.start, type = data.type}
:css{
['counter-reset'] = data.counterReset,
['list-style-type'] = data.listStyleType
}
if data.listStyle then
list:cssText(data.listStyle)
end
-- Render the list items
for _, t in ipairs(data.items or {}) do
local item = list:tag('li')
if data.itemStyle then
item:cssText(data.itemStyle)
end
if t.style then
item:cssText(t.style)
end
item
:attr{value = t.value}
:wikitext(t.content)
end
return data.templatestyles .. tostring(root)
end
function p.renderTrackingCategories(args)
local isDeprecated = false -- Tracks deprecated parameters.
for k, v in pairs(args) do
k = tostring(k)
if k:find('^item_style%d+$') or k:find('^item_value%d+$') then
isDeprecated = true
break
end
end
local ret = ''
if isDeprecated then
ret = ret .. '[[Category:List templates with deprecated parameters]]'
end
return ret
end
function p.makeList(listType, args)
if not listType or not listTypes[listType] then
error(string.format(
"bad argument #1 to 'makeList' ('%s' is not a valid list type)",
tostring(listType)
), 2)
end
checkType('makeList', 2, args, 'table')
local data = p.makeListData(listType, args)
local list = p.renderList(data)
local trackingCategories = p.renderTrackingCategories(args)
return list .. trackingCategories
end
for listType in pairs(listTypes) do
p[listType] = function (frame)
local mArguments = require('Module:Arguments')
local origArgs = mArguments.getArgs(frame, {
valueFunc = function (key, value)
if not value or not mw.ustring.find(value, '%S') then return nil end
if mw.ustring.find(value, '^%s*[%*#;:]') then
return value
else
return value:match('^%s*(.-)%s*$')
end
return nil
end
})
-- Copy all the arguments to a new table, for faster indexing.
local args = {}
for k, v in pairs(origArgs) do
args[k] = v
end
return p.makeList(listType, args)
end
end
return p
7a4f36a6e9cd56370bdd8207d23694124821dc1a
Module:TableTools
828
56
72
71
2024-03-26T22:29:46Z
Vicht
1
1 revision imported
Scribunto
text/plain
------------------------------------------------------------------------------------
-- TableTools --
-- --
-- This module includes a number of functions for dealing with Lua tables. --
-- It is a meta-module, meant to be called from other Lua modules, and should not --
-- be called directly from #invoke. --
------------------------------------------------------------------------------------
local libraryUtil = require('libraryUtil')
local p = {}
-- Define often-used variables and functions.
local floor = math.floor
local infinity = math.huge
local checkType = libraryUtil.checkType
local checkTypeMulti = libraryUtil.checkTypeMulti
------------------------------------------------------------------------------------
-- isPositiveInteger
--
-- This function returns true if the given value is a positive integer, and false
-- if not. Although it doesn't operate on tables, it is included here as it is
-- useful for determining whether a given table key is in the array part or the
-- hash part of a table.
------------------------------------------------------------------------------------
function p.isPositiveInteger(v)
return type(v) == 'number' and v >= 1 and floor(v) == v and v < infinity
end
------------------------------------------------------------------------------------
-- isNan
--
-- This function returns true if the given number is a NaN value, and false if
-- not. Although it doesn't operate on tables, it is included here as it is useful
-- for determining whether a value can be a valid table key. Lua will generate an
-- error if a NaN is used as a table key.
------------------------------------------------------------------------------------
function p.isNan(v)
return type(v) == 'number' and v ~= v
end
------------------------------------------------------------------------------------
-- shallowClone
--
-- This returns a clone of a table. The value returned is a new table, but all
-- subtables and functions are shared. Metamethods are respected, but the returned
-- table will have no metatable of its own.
------------------------------------------------------------------------------------
function p.shallowClone(t)
checkType('shallowClone', 1, t, 'table')
local ret = {}
for k, v in pairs(t) do
ret[k] = v
end
return ret
end
------------------------------------------------------------------------------------
-- removeDuplicates
--
-- This removes duplicate values from an array. Non-positive-integer keys are
-- ignored. The earliest value is kept, and all subsequent duplicate values are
-- removed, but otherwise the array order is unchanged.
------------------------------------------------------------------------------------
function p.removeDuplicates(arr)
checkType('removeDuplicates', 1, arr, 'table')
local isNan = p.isNan
local ret, exists = {}, {}
for _, v in ipairs(arr) do
if isNan(v) then
-- NaNs can't be table keys, and they are also unique, so we don't need to check existence.
ret[#ret + 1] = v
else
if not exists[v] then
ret[#ret + 1] = v
exists[v] = true
end
end
end
return ret
end
------------------------------------------------------------------------------------
-- numKeys
--
-- This takes a table and returns an array containing the numbers of any numerical
-- keys that have non-nil values, sorted in numerical order.
------------------------------------------------------------------------------------
function p.numKeys(t)
checkType('numKeys', 1, t, 'table')
local isPositiveInteger = p.isPositiveInteger
local nums = {}
for k in pairs(t) do
if isPositiveInteger(k) then
nums[#nums + 1] = k
end
end
table.sort(nums)
return nums
end
------------------------------------------------------------------------------------
-- affixNums
--
-- This takes a table and returns an array containing the numbers of keys with the
-- specified prefix and suffix. For example, for the table
-- {a1 = 'foo', a3 = 'bar', a6 = 'baz'} and the prefix "a", affixNums will return
-- {1, 3, 6}.
------------------------------------------------------------------------------------
function p.affixNums(t, prefix, suffix)
checkType('affixNums', 1, t, 'table')
checkType('affixNums', 2, prefix, 'string', true)
checkType('affixNums', 3, suffix, 'string', true)
local function cleanPattern(s)
-- Cleans a pattern so that the magic characters ()%.[]*+-?^$ are interpreted literally.
return s:gsub('([%(%)%%%.%[%]%*%+%-%?%^%$])', '%%%1')
end
prefix = prefix or ''
suffix = suffix or ''
prefix = cleanPattern(prefix)
suffix = cleanPattern(suffix)
local pattern = '^' .. prefix .. '([1-9]%d*)' .. suffix .. '$'
local nums = {}
for k in pairs(t) do
if type(k) == 'string' then
local num = mw.ustring.match(k, pattern)
if num then
nums[#nums + 1] = tonumber(num)
end
end
end
table.sort(nums)
return nums
end
------------------------------------------------------------------------------------
-- numData
--
-- Given a table with keys like {"foo1", "bar1", "foo2", "baz2"}, returns a table
-- of subtables in the format
-- {[1] = {foo = 'text', bar = 'text'}, [2] = {foo = 'text', baz = 'text'}}.
-- Keys that don't end with an integer are stored in a subtable named "other". The
-- compress option compresses the table so that it can be iterated over with
-- ipairs.
------------------------------------------------------------------------------------
function p.numData(t, compress)
checkType('numData', 1, t, 'table')
checkType('numData', 2, compress, 'boolean', true)
local ret = {}
for k, v in pairs(t) do
local prefix, num = mw.ustring.match(tostring(k), '^([^0-9]*)([1-9][0-9]*)$')
if num then
num = tonumber(num)
local subtable = ret[num] or {}
if prefix == '' then
-- Positional parameters match the blank string; put them at the start of the subtable instead.
prefix = 1
end
subtable[prefix] = v
ret[num] = subtable
else
local subtable = ret.other or {}
subtable[k] = v
ret.other = subtable
end
end
if compress then
local other = ret.other
ret = p.compressSparseArray(ret)
ret.other = other
end
return ret
end
------------------------------------------------------------------------------------
-- compressSparseArray
--
-- This takes an array with one or more nil values, and removes the nil values
-- while preserving the order, so that the array can be safely traversed with
-- ipairs.
------------------------------------------------------------------------------------
function p.compressSparseArray(t)
checkType('compressSparseArray', 1, t, 'table')
local ret = {}
local nums = p.numKeys(t)
for _, num in ipairs(nums) do
ret[#ret + 1] = t[num]
end
return ret
end
------------------------------------------------------------------------------------
-- sparseIpairs
--
-- This is an iterator for sparse arrays. It can be used like ipairs, but can
-- handle nil values.
------------------------------------------------------------------------------------
function p.sparseIpairs(t)
checkType('sparseIpairs', 1, t, 'table')
local nums = p.numKeys(t)
local i = 0
local lim = #nums
return function ()
i = i + 1
if i <= lim then
local key = nums[i]
return key, t[key]
else
return nil, nil
end
end
end
------------------------------------------------------------------------------------
-- size
--
-- This returns the size of a key/value pair table. It will also work on arrays,
-- but for arrays it is more efficient to use the # operator.
------------------------------------------------------------------------------------
function p.size(t)
checkType('size', 1, t, 'table')
local i = 0
for _ in pairs(t) do
i = i + 1
end
return i
end
local function defaultKeySort(item1, item2)
-- "number" < "string", so numbers will be sorted before strings.
local type1, type2 = type(item1), type(item2)
if type1 ~= type2 then
return type1 < type2
elseif type1 == 'table' or type1 == 'boolean' or type1 == 'function' then
return tostring(item1) < tostring(item2)
else
return item1 < item2
end
end
------------------------------------------------------------------------------------
-- keysToList
--
-- Returns an array of the keys in a table, sorted using either a default
-- comparison function or a custom keySort function.
------------------------------------------------------------------------------------
function p.keysToList(t, keySort, checked)
if not checked then
checkType('keysToList', 1, t, 'table')
checkTypeMulti('keysToList', 2, keySort, {'function', 'boolean', 'nil'})
end
local arr = {}
local index = 1
for k in pairs(t) do
arr[index] = k
index = index + 1
end
if keySort ~= false then
keySort = type(keySort) == 'function' and keySort or defaultKeySort
table.sort(arr, keySort)
end
return arr
end
------------------------------------------------------------------------------------
-- sortedPairs
--
-- Iterates through a table, with the keys sorted using the keysToList function.
-- If there are only numerical keys, sparseIpairs is probably more efficient.
------------------------------------------------------------------------------------
function p.sortedPairs(t, keySort)
checkType('sortedPairs', 1, t, 'table')
checkType('sortedPairs', 2, keySort, 'function', true)
local arr = p.keysToList(t, keySort, true)
local i = 0
return function ()
i = i + 1
local key = arr[i]
if key ~= nil then
return key, t[key]
else
return nil, nil
end
end
end
------------------------------------------------------------------------------------
-- isArray
--
-- Returns true if the given value is a table and all keys are consecutive
-- integers starting at 1.
------------------------------------------------------------------------------------
function p.isArray(v)
if type(v) ~= 'table' then
return false
end
local i = 0
for _ in pairs(v) do
i = i + 1
if v[i] == nil then
return false
end
end
return true
end
------------------------------------------------------------------------------------
-- isArrayLike
--
-- Returns true if the given value is iterable and all keys are consecutive
-- integers starting at 1.
------------------------------------------------------------------------------------
function p.isArrayLike(v)
if not pcall(pairs, v) then
return false
end
local i = 0
for _ in pairs(v) do
i = i + 1
if v[i] == nil then
return false
end
end
return true
end
------------------------------------------------------------------------------------
-- invert
--
-- Transposes the keys and values in an array. For example, {"a", "b", "c"} ->
-- {a = 1, b = 2, c = 3}. Duplicates are not supported (result values refer to
-- the index of the last duplicate) and NaN values are ignored.
------------------------------------------------------------------------------------
function p.invert(arr)
checkType("invert", 1, arr, "table")
local isNan = p.isNan
local map = {}
for i, v in ipairs(arr) do
if not isNan(v) then
map[v] = i
end
end
return map
end
------------------------------------------------------------------------------------
-- listToSet
--
-- Creates a set from the array part of the table. Indexing the set by any of the
-- values of the array returns true. For example, {"a", "b", "c"} ->
-- {a = true, b = true, c = true}. NaN values are ignored as Lua considers them
-- never equal to any value (including other NaNs or even themselves).
------------------------------------------------------------------------------------
function p.listToSet(arr)
checkType("listToSet", 1, arr, "table")
local isNan = p.isNan
local set = {}
for _, v in ipairs(arr) do
if not isNan(v) then
set[v] = true
end
end
return set
end
------------------------------------------------------------------------------------
-- deepCopy
--
-- Recursive deep copy function. Preserves identities of subtables.
------------------------------------------------------------------------------------
local function _deepCopy(orig, includeMetatable, already_seen)
-- Stores copies of tables indexed by the original table.
already_seen = already_seen or {}
local copy = already_seen[orig]
if copy ~= nil then
return copy
end
if type(orig) == 'table' then
copy = {}
for orig_key, orig_value in pairs(orig) do
copy[_deepCopy(orig_key, includeMetatable, already_seen)] = _deepCopy(orig_value, includeMetatable, already_seen)
end
already_seen[orig] = copy
if includeMetatable then
local mt = getmetatable(orig)
if mt ~= nil then
local mt_copy = _deepCopy(mt, includeMetatable, already_seen)
setmetatable(copy, mt_copy)
already_seen[mt] = mt_copy
end
end
else -- number, string, boolean, etc
copy = orig
end
return copy
end
function p.deepCopy(orig, noMetatable, already_seen)
checkType("deepCopy", 3, already_seen, "table", true)
return _deepCopy(orig, not noMetatable, already_seen)
end
------------------------------------------------------------------------------------
-- sparseConcat
--
-- Concatenates all values in the table that are indexed by a number, in order.
-- sparseConcat{a, nil, c, d} => "acd"
-- sparseConcat{nil, b, c, d} => "bcd"
------------------------------------------------------------------------------------
function p.sparseConcat(t, sep, i, j)
local arr = {}
local arr_i = 0
for _, v in p.sparseIpairs(t) do
arr_i = arr_i + 1
arr[arr_i] = v
end
return table.concat(arr, sep, i, j)
end
------------------------------------------------------------------------------------
-- length
--
-- Finds the length of an array, or of a quasi-array with keys such as "data1",
-- "data2", etc., using an exponential search algorithm. It is similar to the
-- operator #, but may return a different value when there are gaps in the array
-- portion of the table. Intended to be used on data loaded with mw.loadData. For
-- other tables, use #.
-- Note: #frame.args in frame object always be set to 0, regardless of the number
-- of unnamed template parameters, so use this function for frame.args.
------------------------------------------------------------------------------------
function p.length(t, prefix)
-- requiring module inline so that [[Module:Exponential search]] which is
-- only needed by this one function doesn't get millions of transclusions
local expSearch = require("Module:Exponential search")
checkType('length', 1, t, 'table')
checkType('length', 2, prefix, 'string', true)
return expSearch(function (i)
local key
if prefix then
key = prefix .. tostring(i)
else
key = i
end
return t[key] ~= nil
end) or 0
end
------------------------------------------------------------------------------------
-- inArray
--
-- Returns true if valueToFind is a member of the array, and false otherwise.
------------------------------------------------------------------------------------
function p.inArray(arr, valueToFind)
checkType("inArray", 1, arr, "table")
-- if valueToFind is nil, error?
for _, v in ipairs(arr) do
if v == valueToFind then
return true
end
end
return false
end
return p
085e7094ac84eb0132ee65822cf3f69cd8ba3d81
Template:Sidebar
10
57
74
73
2024-03-26T22:29:46Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
{{#invoke:Sidebar|sidebar}}<noinclude>
{{documentation}}</noinclude>
ab2498000a99daf324f656b0badd187b4a3e2b42
Template:Plainlist
10
58
76
75
2024-03-26T22:29:46Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
<templatestyles src="Plainlist/styles.css"/><div class="plainlist {{{class|}}}" {{#if:{{{style|}}}{{{indent|}}}|style="{{#if:{{{indent|}}}|margin-left: {{#expr:{{{indent}}}*1.6}}em;}} {{{style|}}}"}}>{{#if:{{{1|}}}|
{{{1}}}
</div>}}<noinclude></div>
{{documentation}}
</noinclude>
582fe7098c25c1ecfc0ad32f62ecd674ebe2bdf0
Module:Effective protection expiry
828
59
78
77
2024-03-26T22:29:46Z
Vicht
1
1 revision imported
Scribunto
text/plain
local p = {}
-- Returns the expiry of a restriction of an action on a given title, or unknown if it cannot be known.
-- If no title is specified, the title of the page being displayed is used.
function p._main(action, pagename)
local title
if type(pagename) == 'table' and pagename.prefixedText then
title = pagename
elseif pagename then
title = mw.title.new(pagename)
else
title = mw.title.getCurrentTitle()
end
pagename = title.prefixedText
if action == 'autoreview' then
local stabilitySettings = mw.ext.FlaggedRevs.getStabilitySettings(title)
return stabilitySettings and stabilitySettings.expiry or 'unknown'
elseif action ~= 'edit' and action ~= 'move' and action ~= 'create' and action ~= 'upload' then
error( 'First parameter must be one of edit, move, create, upload, autoreview', 2 )
end
local rawExpiry = mw.getCurrentFrame():callParserFunction('PROTECTIONEXPIRY', action, pagename)
if rawExpiry == 'infinity' then
return 'infinity'
elseif rawExpiry == '' then
return 'unknown'
else
local year, month, day, hour, minute, second = rawExpiry:match(
'^(%d%d%d%d)(%d%d)(%d%d)(%d%d)(%d%d)(%d%d)$'
)
if year then
return string.format(
'%s-%s-%sT%s:%s:%s',
year, month, day, hour, minute, second
)
else
error('internal error in Module:Effective protection expiry; malformed expiry timestamp')
end
end
end
setmetatable(p, { __index = function(t, k)
return function(frame)
return t._main(k, frame.args[1])
end
end })
return p
9a8c58dc2667232ed08a9b206a5d89ca8150312b
Module:Effective protection level
828
60
80
79
2024-03-26T22:29:46Z
Vicht
1
1 revision imported
Scribunto
text/plain
local p = {}
-- Returns the permission required to perform a given action on a given title.
-- If no title is specified, the title of the page being displayed is used.
function p._main(action, pagename)
local title
if type(pagename) == 'table' and pagename.prefixedText then
title = pagename
elseif pagename then
title = mw.title.new(pagename)
else
title = mw.title.getCurrentTitle()
end
pagename = title.prefixedText
if action == 'autoreview' then
local level = mw.ext.FlaggedRevs.getStabilitySettings(title)
level = level and level.autoreview
if level == 'review' then
return 'reviewer'
elseif level ~= '' then
return level
else
return nil -- not '*'. a page not being PC-protected is distinct from it being PC-protected with anyone able to review. also not '', as that would mean PC-protected but nobody can review
end
elseif action ~= 'edit' and action ~= 'move' and action ~= 'create' and action ~= 'upload' and action ~= 'undelete' then
error( 'First parameter must be one of edit, move, create, upload, undelete, autoreview', 2 )
end
if title.namespace == 8 then -- MediaWiki namespace
if title.text:sub(-3) == '.js' or title.text:sub(-4) == '.css' or title.contentModel == 'javascript' or title.contentModel == 'css' then -- site JS or CSS page
return 'interfaceadmin'
else -- any non-JS/CSS MediaWiki page
return 'sysop'
end
elseif title.namespace == 2 and title.isSubpage then
if title.contentModel == 'javascript' or title.contentModel == 'css' then -- user JS or CSS page
return 'interfaceadmin'
elseif title.contentModel == 'json' then -- user JSON page
return 'sysop'
end
end
if action == 'undelete' then
return 'sysop'
end
local level = title.protectionLevels[action] and title.protectionLevels[action][1]
if level == 'sysop' or level == 'editprotected' then
return 'sysop'
elseif title.cascadingProtection.restrictions[action] and title.cascadingProtection.restrictions[action][1] then -- used by a cascading-protected page
return 'sysop'
elseif level == 'templateeditor' then
return 'templateeditor'
elseif action == 'move' then
local blacklistentry = mw.ext.TitleBlacklist.test('edit', pagename) -- Testing action edit is correct, since this is for the source page. The target page name gets tested with action move.
if blacklistentry and not blacklistentry.params.autoconfirmed then
return 'templateeditor'
elseif title.namespace == 6 then
return 'filemover'
elseif level == 'extendedconfirmed' then
return 'extendedconfirmed'
else
return 'autoconfirmed'
end
end
local blacklistentry = mw.ext.TitleBlacklist.test(action, pagename)
if blacklistentry then
if not blacklistentry.params.autoconfirmed then
return 'templateeditor'
elseif level == 'extendedconfirmed' then
return 'extendedconfirmed'
else
return 'autoconfirmed'
end
elseif level == 'editsemiprotected' then -- create-semiprotected pages return this for some reason
return 'autoconfirmed'
elseif level then
return level
elseif action == 'upload' then
return 'autoconfirmed'
elseif action == 'create' and title.namespace % 2 == 0 and title.namespace ~= 118 then -- You need to be registered, but not autoconfirmed, to create non-talk pages other than drafts
if title.namespace == 0 then
return 'autoconfirmed' -- Per [[WP:ACPERM]], you need to be autoconfirmed to create pages in mainspace
end
return 'user'
else
return '*'
end
end
setmetatable(p, { __index = function(t, k)
return function(frame)
return t._main(k, frame.args[1])
end
end })
return p
b6cb1e5589ec6575118f60841644cd65defa7174
Module:File link
828
61
82
81
2024-03-26T22:29:46Z
Vicht
1
1 revision imported
Scribunto
text/plain
-- This module provides a library for formatting file wikilinks.
local yesno = require('Module:Yesno')
local checkType = require('libraryUtil').checkType
local p = {}
function p._main(args)
checkType('_main', 1, args, 'table')
-- This is basically libraryUtil.checkTypeForNamedArg, but we are rolling our
-- own function to get the right error level.
local function checkArg(key, val, level)
if type(val) ~= 'string' then
error(string.format(
"type error in '%s' parameter of '_main' (expected string, got %s)",
key, type(val)
), level)
end
end
local ret = {}
-- Adds a positional parameter to the buffer.
local function addPositional(key)
local val = args[key]
if not val then
return nil
end
checkArg(key, val, 4)
ret[#ret + 1] = val
end
-- Adds a named parameter to the buffer. We assume that the parameter name
-- is the same as the argument key.
local function addNamed(key)
local val = args[key]
if not val then
return nil
end
checkArg(key, val, 4)
ret[#ret + 1] = key .. '=' .. val
end
-- Filename
checkArg('file', args.file, 3)
ret[#ret + 1] = 'File:' .. args.file
-- Format
if args.format then
checkArg('format', args.format)
if args.formatfile then
checkArg('formatfile', args.formatfile)
ret[#ret + 1] = args.format .. '=' .. args.formatfile
else
ret[#ret + 1] = args.format
end
end
-- Border
if yesno(args.border) then
ret[#ret + 1] = 'border'
end
addPositional('location')
addPositional('alignment')
addPositional('size')
addNamed('upright')
addNamed('link')
addNamed('alt')
addNamed('page')
addNamed('class')
addNamed('lang')
addNamed('start')
addNamed('end')
addNamed('thumbtime')
addPositional('caption')
return string.format('[[%s]]', table.concat(ret, '|'))
end
function p.main(frame)
local origArgs = require('Module:Arguments').getArgs(frame, {
wrappers = 'Template:File link'
})
if not origArgs.file then
error("'file' parameter missing from [[Template:File link]]", 0)
end
-- Copy the arguments that were passed to a new table to avoid looking up
-- every possible parameter in the frame object.
local args = {}
for k, v in pairs(origArgs) do
-- Make _BLANK a special argument to add a blank parameter. For use in
-- conditional templates etc. it is useful for blank arguments to be
-- ignored, but we still need a way to specify them so that we can do
-- things like [[File:Example.png|link=]].
if v == '_BLANK' then
v = ''
end
args[k] = v
end
return p._main(args)
end
return p
66925f088d11530f2482f04181a3baaaa0ad3d0c
Module:Navbar
828
62
84
83
2024-03-26T22:29:47Z
Vicht
1
1 revision imported
Scribunto
text/plain
local p = {}
local cfg = mw.loadData('Module:Navbar/configuration')
local function get_title_arg(is_collapsible, template)
local title_arg = 1
if is_collapsible then title_arg = 2 end
if template then title_arg = 'template' end
return title_arg
end
local function choose_links(template, args)
-- The show table indicates the default displayed items.
-- view, talk, edit, hist, move, watch
-- TODO: Move to configuration.
local show = {true, true, true, false, false, false}
if template then
show[2] = false
show[3] = false
local index = {t = 2, d = 2, e = 3, h = 4, m = 5, w = 6,
talk = 2, edit = 3, hist = 4, move = 5, watch = 6}
-- TODO: Consider removing TableTools dependency.
for _, v in ipairs(require ('Module:TableTools').compressSparseArray(args)) do
local num = index[v]
if num then show[num] = true end
end
end
local remove_edit_link = args.noedit
if remove_edit_link then show[3] = false end
return show
end
local function add_link(link_description, ul, is_mini, font_style)
local l
if link_description.url then
l = {'[', '', ']'}
else
l = {'[[', '|', ']]'}
end
ul:tag('li')
:addClass('nv-' .. link_description.full)
:wikitext(l[1] .. link_description.link .. l[2])
:tag(is_mini and 'abbr' or 'span')
:attr('title', link_description.html_title)
:cssText(font_style)
:wikitext(is_mini and link_description.mini or link_description.full)
:done()
:wikitext(l[3])
:done()
end
local function make_list(title_text, has_brackets, displayed_links, is_mini, font_style)
local title = mw.title.new(mw.text.trim(title_text), cfg.title_namespace)
if not title then
error(cfg.invalid_title .. title_text)
end
local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or ''
-- TODO: Get link_descriptions and show into the configuration module.
-- link_descriptions should be easier...
local link_descriptions = {
{ ['mini'] = 'v', ['full'] = 'view', ['html_title'] = 'View this template',
['link'] = title.fullText, ['url'] = false },
{ ['mini'] = 't', ['full'] = 'talk', ['html_title'] = 'Discuss this template',
['link'] = talkpage, ['url'] = false },
{ ['mini'] = 'e', ['full'] = 'edit', ['html_title'] = 'Edit this template',
['link'] = 'Special:EditPage/' .. title.fullText, ['url'] = false },
{ ['mini'] = 'h', ['full'] = 'hist', ['html_title'] = 'History of this template',
['link'] = 'Special:PageHistory/' .. title.fullText, ['url'] = false },
{ ['mini'] = 'm', ['full'] = 'move', ['html_title'] = 'Move this template',
['link'] = mw.title.new('Special:Movepage'):fullUrl('target='..title.fullText), ['url'] = true },
{ ['mini'] = 'w', ['full'] = 'watch', ['html_title'] = 'Watch this template',
['link'] = title:fullUrl('action=watch'), ['url'] = true }
}
local ul = mw.html.create('ul')
if has_brackets then
ul:addClass(cfg.classes.brackets)
:cssText(font_style)
end
for i, _ in ipairs(displayed_links) do
if displayed_links[i] then add_link(link_descriptions[i], ul, is_mini, font_style) end
end
return ul:done()
end
function p._navbar(args)
-- TODO: We probably don't need both fontstyle and fontcolor...
local font_style = args.fontstyle
local font_color = args.fontcolor
local is_collapsible = args.collapsible
local is_mini = args.mini
local is_plain = args.plain
local collapsible_class = nil
if is_collapsible then
collapsible_class = cfg.classes.collapsible
if not is_plain then is_mini = 1 end
if font_color then
font_style = (font_style or '') .. '; color: ' .. font_color .. ';'
end
end
local navbar_style = args.style
local div = mw.html.create():tag('div')
div
:addClass(cfg.classes.navbar)
:addClass(cfg.classes.plainlinks)
:addClass(cfg.classes.horizontal_list)
:addClass(collapsible_class) -- we made the determination earlier
:cssText(navbar_style)
if is_mini then div:addClass(cfg.classes.mini) end
local box_text = (args.text or cfg.box_text) .. ' '
-- the concatenated space guarantees the box text is separated
if not (is_mini or is_plain) then
div
:tag('span')
:addClass(cfg.classes.box_text)
:cssText(font_style)
:wikitext(box_text)
end
local template = args.template
local displayed_links = choose_links(template, args)
local has_brackets = args.brackets
local title_arg = get_title_arg(is_collapsible, template)
local title_text = args[title_arg] or (':' .. mw.getCurrentFrame():getParent():getTitle())
local list = make_list(title_text, has_brackets, displayed_links, is_mini, font_style)
div:node(list)
if is_collapsible then
local title_text_class
if is_mini then
title_text_class = cfg.classes.collapsible_title_mini
else
title_text_class = cfg.classes.collapsible_title_full
end
div:done()
:tag('div')
:addClass(title_text_class)
:cssText(font_style)
:wikitext(args[1])
end
local frame = mw.getCurrentFrame()
-- hlist -> navbar is best-effort to preserve old Common.css ordering.
return frame:extensionTag{
name = 'templatestyles', args = { src = cfg.hlist_templatestyles }
} .. frame:extensionTag{
name = 'templatestyles', args = { src = cfg.templatestyles }
} .. tostring(div:done())
end
function p.navbar(frame)
return p._navbar(require('Module:Arguments').getArgs(frame))
end
return p
047f307758c878eb3e99ed1768cc40920a6ec5fa
Module:Navbar/configuration
828
63
86
85
2024-03-26T22:29:47Z
Vicht
1
1 revision imported
Scribunto
text/plain
return {
['templatestyles'] = 'Module:Navbar/styles.css',
['hlist_templatestyles'] = 'Hlist/styles.css',
['box_text'] = 'This box: ', -- default text box when not plain or mini
['title_namespace'] = 'Template', -- namespace to default to for title
['invalid_title'] = 'Invalid title ',
['classes'] = { -- set a line to nil if you don't want it
['navbar'] = 'navbar',
['plainlinks'] = 'plainlinks', -- plainlinks
['horizontal_list'] = 'hlist', -- horizontal list class
['mini'] = 'navbar-mini', -- class indicating small links in the navbar
['this_box'] = 'navbar-boxtext',
['brackets'] = 'navbar-brackets',
-- 'collapsible' is the key for a class to indicate the navbar is
-- setting up the collapsible element in addition to the normal
-- navbar.
['collapsible'] = 'navbar-collapse',
['collapsible_title_mini'] = 'navbar-ct-mini',
['collapsible_title_full'] = 'navbar-ct-full'
}
}
b007c336b17ec4bcd4d5a9dca9f8cba301662b55
Module:Navbox/configuration
828
64
88
87
2024-03-26T22:29:47Z
Vicht
1
1 revision imported
Scribunto
text/plain
return {
aria_label = 'Navbox',
nowrap_item = '%s<span class="nowrap">%s</span>',
templatestyles = mw.getCurrentFrame():extensionTag{
name = 'templatestyles', args = { src = 'Module:Navbox/styles.css' }
},
hlist_templatestyles = 'Hlist/styles.css',
plainlist_templatestyles = 'Plainlist/styles.css',
-- do not localize marker table
marker = {
oddeven = '\127_ODDEVEN_\127',
restart = '\127_ODDEVEN0_\127',
regex = '\127_ODDEVEN(%d?)_\127'
},
category = {
orphan = '[[Category:Navbox orphans]]',
horizontal_lists = 'Navigational boxes without horizontal lists',
background_colors = 'Navboxes using background colours',
illegible = 'Potentially illegible navboxes',
borders = 'Navboxes using borders',
},
keyword = {
border_subgroup = 'subgroup',
border_child = 'child',
border_none = 'none',
evenodd_swap = 'swap',
navbar_off = 'off',
navbar_plain = 'plain',
nocat_false = 'false',
nowrapitems_yes = 'yes',
orphan_yes = 'yes',
state_collapsed = 'collapsed',
state_off = 'off',
state_plain = 'plain',
subpage_doc = 'doc',
subpage_sandbox = 'sandbox',
subpage_testcases = 'testcases',
tracking_no = 'no'
},
class = {
autocollapse = 'autocollapse',
collapsible = 'mw-collapsible',
collapsed = 'mw-collapsed',
-- Warning
navbox = 'navbox', -- WMF currently hides 'navbox' from mobile,
-- so you probably shouldn't change the navbox class.
navbox_abovebelow = 'navbox-abovebelow',
navbox_group = 'navbox-group',
navbox_image = 'navbox-image',
navbox_inner = 'navbox-inner',
navbox_list = 'navbox-list',
navbox_list_with_group = 'navbox-list-with-group',
navbox_part = 'navbox-', -- do not l10n
navbox_styles = 'navbox-styles',
navbox_subgroup = 'navbox-subgroup',
navbox_title = 'navbox-title', -- l10n only if you change pattern.navbox_title below
navbox_odd_part = 'odd', -- do not l10n
navbox_even_part = 'even', -- do not l10n
nomobile = 'nomobile',
nowraplinks = 'nowraplinks',
noviewer = 'noviewer' -- used to remove images from MediaViewer
},
pattern = {
listnum = '^list(%d+)$',
class = 'class',
sandbox = '/sandbox$',
navbox = 'Template:Navbox',
nowrap = '^<span class="nowrap">',
style = 'style$',
navbox_title = '<th[^>]*"navbox%-title"',
hlist = 'hlist',
plainlist = 'plainlist',
},
arg = {
above = 'above',
aboveclass = 'aboveclass',
abovestyle = 'abovestyle',
basestyle = 'basestyle',
bodyclass = 'bodyclass',
bodystyle = 'bodystyle',
border = 'border',
below = 'below',
belowclass = 'belowclass',
belowstyle = 'belowstyle',
evenodd = 'evenodd',
evenstyle = 'evenstyle',
group1 = 'group1',
group2 = 'group2',
group_and_num = 'group%d',
groupstyle_and_num = 'group%dstyle',
groupclass = 'groupclass',
groupstyle = 'groupstyle',
groupwidth = 'groupwidth',
innerstyle = 'innerstyle',
image = 'image',
imageclass = 'imageclass',
imageleft = 'imageleft',
imageleftstyle = 'imageleftstyle',
imagesetyle = 'imagestyle',
list_and_num = 'list%d',
listclass_and_num = 'list%dclass',
liststyle_and_num = 'list%dstyle',
list1padding = 'list1padding',
listclass = 'listclass',
listpadding = 'listpadding',
liststyle = 'liststyle',
name = 'name',
navbar = 'navbar',
navboxclass = 'navboxclass',
nocat = 'nocat',
nowrapitems = 'nowrapitems',
oddstyle = 'oddstyle',
orphan = 'orphan',
state = 'state',
style = 'style',
templatestyles = 'templatestyles',
child_templatestyles = 'child templatestyles',
title = 'title',
titleclass = 'titleclass',
titlestyle = 'titlestyle',
tracking = 'tracking'
},
-- names of navbar arguments
navbar = {
name = 1,
fontstyle = 'fontstyle',
mini = 'mini'
}
}
4148736fd32a93636c0413e73ed38afaef065ec9
Module:Navbox/styles.css
828
65
90
89
2024-03-26T22:29:47Z
Vicht
1
1 revision imported
sanitized-css
text/css
/* {{pp|small=y}} */
.navbox {
box-sizing: border-box;
border: 1px solid #a2a9b1;
width: 100%;
clear: both;
font-size: 88%;
text-align: center;
padding: 1px;
margin: 1em auto 0; /* Prevent preceding content from clinging to navboxes */
}
.navbox .navbox {
margin-top: 0; /* No top margin for nested navboxes */
}
.navbox + .navbox, /* TODO: remove first line after transclusions have updated */
.navbox + .navbox-styles + .navbox {
margin-top: -1px; /* Single pixel border between adjacent navboxes */
}
.navbox-inner,
.navbox-subgroup {
width: 100%;
}
.navbox-group,
.navbox-title,
.navbox-abovebelow {
padding: 0.25em 1em;
line-height: 1.5em;
text-align: center;
}
.navbox-group {
white-space: nowrap;
/* @noflip */
text-align: right;
}
.navbox,
.navbox-subgroup {
background-color: #fdfdfd;
}
.navbox-list {
line-height: 1.5em;
border-color: #fdfdfd; /* Must match background color */
}
.navbox-list-with-group {
text-align: left;
border-left-width: 2px;
border-left-style: solid;
}
/* cell spacing for navbox cells */
/* Borders above 2nd, 3rd, etc. rows */
/* TODO: figure out how to replace tr as structure;
* with div structure it should be just a matter of first-child */
tr + tr > .navbox-abovebelow,
tr + tr > .navbox-group,
tr + tr > .navbox-image,
tr + tr > .navbox-list {
border-top: 2px solid #fdfdfd; /* Must match background color */
}
.navbox-title {
background-color: #ccf; /* Level 1 color */
}
.navbox-abovebelow,
.navbox-group,
.navbox-subgroup .navbox-title {
background-color: #ddf; /* Level 2 color */
}
.navbox-subgroup .navbox-group,
.navbox-subgroup .navbox-abovebelow {
background-color: #e6e6ff; /* Level 3 color */
}
.navbox-even {
background-color: #f7f7f7;
}
.navbox-odd {
background-color: transparent;
}
/* TODO: figure out how to remove reliance on td as structure */
.navbox .hlist td dl,
.navbox .hlist td ol,
.navbox .hlist td ul,
.navbox td.hlist dl,
.navbox td.hlist ol,
.navbox td.hlist ul {
padding: 0.125em 0;
}
.navbox .navbar {
display: block;
font-size: 100%;
}
.navbox-title .navbar {
/* @noflip */
float: left;
/* @noflip */
text-align: left;
/* @noflip */
margin-right: 0.5em;
}
e80b0d7a5770e6e105dab832deb6c37a5245ebc6
Module:Protection banner
828
66
92
91
2024-03-26T22:29:47Z
Vicht
1
1 revision imported
Scribunto
text/plain
-- This module implements {{pp-meta}} and its daughter templates such as
-- {{pp-dispute}}, {{pp-vandalism}} and {{pp-sock}}.
-- Initialise necessary modules.
require('strict')
local makeFileLink = require('Module:File link')._main
local effectiveProtectionLevel = require('Module:Effective protection level')._main
local effectiveProtectionExpiry = require('Module:Effective protection expiry')._main
local yesno = require('Module:Yesno')
-- Lazily initialise modules and objects we don't always need.
local getArgs, makeMessageBox, lang
-- Set constants.
local CONFIG_MODULE = 'Module:Protection banner/config'
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function makeCategoryLink(cat, sort)
if cat then
return string.format(
'[[%s:%s|%s]]',
mw.site.namespaces[14].name,
cat,
sort
)
end
end
-- Validation function for the expiry and the protection date
local function validateDate(dateString, dateType)
if not lang then
lang = mw.language.getContentLanguage()
end
local success, result = pcall(lang.formatDate, lang, 'U', dateString)
if success then
result = tonumber(result)
if result then
return result
end
end
error(string.format(
'invalid %s: %s',
dateType,
tostring(dateString)
), 4)
end
local function makeFullUrl(page, query, display)
return string.format(
'[%s %s]',
tostring(mw.uri.fullUrl(page, query)),
display
)
end
-- Given a directed graph formatted as node -> table of direct successors,
-- get a table of all nodes reachable from a given node (though always
-- including the given node).
local function getReachableNodes(graph, start)
local toWalk, retval = {[start] = true}, {}
while true do
-- Can't use pairs() since we're adding and removing things as we're iterating
local k = next(toWalk) -- This always gets the "first" key
if k == nil then
return retval
end
toWalk[k] = nil
retval[k] = true
for _,v in ipairs(graph[k]) do
if not retval[v] then
toWalk[v] = true
end
end
end
end
--------------------------------------------------------------------------------
-- Protection class
--------------------------------------------------------------------------------
local Protection = {}
Protection.__index = Protection
Protection.supportedActions = {
edit = true,
move = true,
autoreview = true,
upload = true
}
Protection.bannerConfigFields = {
'text',
'explanation',
'tooltip',
'alt',
'link',
'image'
}
function Protection.new(args, cfg, title)
local obj = {}
obj._cfg = cfg
obj.title = title or mw.title.getCurrentTitle()
-- Set action
if not args.action then
obj.action = 'edit'
elseif Protection.supportedActions[args.action] then
obj.action = args.action
else
error(string.format(
'invalid action: %s',
tostring(args.action)
), 3)
end
-- Set level
obj.level = args.demolevel or effectiveProtectionLevel(obj.action, obj.title)
if not obj.level or (obj.action == 'move' and obj.level == 'autoconfirmed') then
-- Users need to be autoconfirmed to move pages anyway, so treat
-- semi-move-protected pages as unprotected.
obj.level = '*'
end
-- Set expiry
local effectiveExpiry = effectiveProtectionExpiry(obj.action, obj.title)
if effectiveExpiry == 'infinity' then
obj.expiry = 'indef'
elseif effectiveExpiry ~= 'unknown' then
obj.expiry = validateDate(effectiveExpiry, 'expiry date')
end
-- Set reason
if args[1] then
obj.reason = mw.ustring.lower(args[1])
if obj.reason:find('|') then
error('reasons cannot contain the pipe character ("|")', 3)
end
end
-- Set protection date
if args.date then
obj.protectionDate = validateDate(args.date, 'protection date')
end
-- Set banner config
do
obj.bannerConfig = {}
local configTables = {}
if cfg.banners[obj.action] then
configTables[#configTables + 1] = cfg.banners[obj.action][obj.reason]
end
if cfg.defaultBanners[obj.action] then
configTables[#configTables + 1] = cfg.defaultBanners[obj.action][obj.level]
configTables[#configTables + 1] = cfg.defaultBanners[obj.action].default
end
configTables[#configTables + 1] = cfg.masterBanner
for i, field in ipairs(Protection.bannerConfigFields) do
for j, t in ipairs(configTables) do
if t[field] then
obj.bannerConfig[field] = t[field]
break
end
end
end
end
return setmetatable(obj, Protection)
end
function Protection:isUserScript()
-- Whether the page is a user JavaScript or CSS page.
local title = self.title
return title.namespace == 2 and (
title.contentModel == 'javascript' or title.contentModel == 'css'
)
end
function Protection:isProtected()
return self.level ~= '*'
end
function Protection:shouldShowLock()
-- Whether we should output a banner/padlock
return self:isProtected() and not self:isUserScript()
end
-- Whether this page needs a protection category.
Protection.shouldHaveProtectionCategory = Protection.shouldShowLock
function Protection:isTemporary()
return type(self.expiry) == 'number'
end
function Protection:makeProtectionCategory()
if not self:shouldHaveProtectionCategory() then
return ''
end
local cfg = self._cfg
local title = self.title
-- Get the expiry key fragment.
local expiryFragment
if self.expiry == 'indef' then
expiryFragment = self.expiry
elseif type(self.expiry) == 'number' then
expiryFragment = 'temp'
end
-- Get the namespace key fragment.
local namespaceFragment = cfg.categoryNamespaceKeys[title.namespace]
if not namespaceFragment and title.namespace % 2 == 1 then
namespaceFragment = 'talk'
end
-- Define the order that key fragments are tested in. This is done with an
-- array of tables containing the value to be tested, along with its
-- position in the cfg.protectionCategories table.
local order = {
{val = expiryFragment, keypos = 1},
{val = namespaceFragment, keypos = 2},
{val = self.reason, keypos = 3},
{val = self.level, keypos = 4},
{val = self.action, keypos = 5}
}
--[[
-- The old protection templates used an ad-hoc protection category system,
-- with some templates prioritising namespaces in their categories, and
-- others prioritising the protection reason. To emulate this in this module
-- we use the config table cfg.reasonsWithNamespacePriority to set the
-- reasons for which namespaces have priority over protection reason.
-- If we are dealing with one of those reasons, move the namespace table to
-- the end of the order table, i.e. give it highest priority. If not, the
-- reason should have highest priority, so move that to the end of the table
-- instead.
--]]
table.insert(order, table.remove(order, self.reason and cfg.reasonsWithNamespacePriority[self.reason] and 2 or 3))
--[[
-- Define the attempt order. Inactive subtables (subtables with nil "value"
-- fields) are moved to the end, where they will later be given the key
-- "all". This is to cut down on the number of table lookups in
-- cfg.protectionCategories, which grows exponentially with the number of
-- non-nil keys. We keep track of the number of active subtables with the
-- noActive parameter.
--]]
local noActive, attemptOrder
do
local active, inactive = {}, {}
for i, t in ipairs(order) do
if t.val then
active[#active + 1] = t
else
inactive[#inactive + 1] = t
end
end
noActive = #active
attemptOrder = active
for i, t in ipairs(inactive) do
attemptOrder[#attemptOrder + 1] = t
end
end
--[[
-- Check increasingly generic key combinations until we find a match. If a
-- specific category exists for the combination of key fragments we are
-- given, that match will be found first. If not, we keep trying different
-- key fragment combinations until we match using the key
-- "all-all-all-all-all".
--
-- To generate the keys, we index the key subtables using a binary matrix
-- with indexes i and j. j is only calculated up to the number of active
-- subtables. For example, if there were three active subtables, the matrix
-- would look like this, with 0 corresponding to the key fragment "all", and
-- 1 corresponding to other key fragments.
--
-- j 1 2 3
-- i
-- 1 1 1 1
-- 2 0 1 1
-- 3 1 0 1
-- 4 0 0 1
-- 5 1 1 0
-- 6 0 1 0
-- 7 1 0 0
-- 8 0 0 0
--
-- Values of j higher than the number of active subtables are set
-- to the string "all".
--
-- A key for cfg.protectionCategories is constructed for each value of i.
-- The position of the value in the key is determined by the keypos field in
-- each subtable.
--]]
local cats = cfg.protectionCategories
for i = 1, 2^noActive do
local key = {}
for j, t in ipairs(attemptOrder) do
if j > noActive then
key[t.keypos] = 'all'
else
local quotient = i / 2 ^ (j - 1)
quotient = math.ceil(quotient)
if quotient % 2 == 1 then
key[t.keypos] = t.val
else
key[t.keypos] = 'all'
end
end
end
key = table.concat(key, '|')
local attempt = cats[key]
if attempt then
return makeCategoryLink(attempt, title.text)
end
end
return ''
end
function Protection:isIncorrect()
local expiry = self.expiry
return not self:shouldHaveProtectionCategory()
or type(expiry) == 'number' and expiry < os.time()
end
function Protection:isTemplateProtectedNonTemplate()
local action, namespace = self.action, self.title.namespace
return self.level == 'templateeditor'
and (
(action ~= 'edit' and action ~= 'move')
or (namespace ~= 10 and namespace ~= 828)
)
end
function Protection:makeCategoryLinks()
local msg = self._cfg.msg
local ret = {self:makeProtectionCategory()}
if self:isIncorrect() then
ret[#ret + 1] = makeCategoryLink(
msg['tracking-category-incorrect'],
self.title.text
)
end
if self:isTemplateProtectedNonTemplate() then
ret[#ret + 1] = makeCategoryLink(
msg['tracking-category-template'],
self.title.text
)
end
return table.concat(ret)
end
--------------------------------------------------------------------------------
-- Blurb class
--------------------------------------------------------------------------------
local Blurb = {}
Blurb.__index = Blurb
Blurb.bannerTextFields = {
text = true,
explanation = true,
tooltip = true,
alt = true,
link = true
}
function Blurb.new(protectionObj, args, cfg)
return setmetatable({
_cfg = cfg,
_protectionObj = protectionObj,
_args = args
}, Blurb)
end
-- Private methods --
function Blurb:_formatDate(num)
-- Formats a Unix timestamp into dd Month, YYYY format.
lang = lang or mw.language.getContentLanguage()
local success, date = pcall(
lang.formatDate,
lang,
self._cfg.msg['expiry-date-format'] or 'j F Y',
'@' .. tostring(num)
)
if success then
return date
end
end
function Blurb:_getExpandedMessage(msgKey)
return self:_substituteParameters(self._cfg.msg[msgKey])
end
function Blurb:_substituteParameters(msg)
if not self._params then
local parameterFuncs = {}
parameterFuncs.CURRENTVERSION = self._makeCurrentVersionParameter
parameterFuncs.EDITREQUEST = self._makeEditRequestParameter
parameterFuncs.EXPIRY = self._makeExpiryParameter
parameterFuncs.EXPLANATIONBLURB = self._makeExplanationBlurbParameter
parameterFuncs.IMAGELINK = self._makeImageLinkParameter
parameterFuncs.INTROBLURB = self._makeIntroBlurbParameter
parameterFuncs.INTROFRAGMENT = self._makeIntroFragmentParameter
parameterFuncs.PAGETYPE = self._makePagetypeParameter
parameterFuncs.PROTECTIONBLURB = self._makeProtectionBlurbParameter
parameterFuncs.PROTECTIONDATE = self._makeProtectionDateParameter
parameterFuncs.PROTECTIONLEVEL = self._makeProtectionLevelParameter
parameterFuncs.PROTECTIONLOG = self._makeProtectionLogParameter
parameterFuncs.TALKPAGE = self._makeTalkPageParameter
parameterFuncs.TOOLTIPBLURB = self._makeTooltipBlurbParameter
parameterFuncs.TOOLTIPFRAGMENT = self._makeTooltipFragmentParameter
parameterFuncs.VANDAL = self._makeVandalTemplateParameter
self._params = setmetatable({}, {
__index = function (t, k)
local param
if parameterFuncs[k] then
param = parameterFuncs[k](self)
end
param = param or ''
t[k] = param
return param
end
})
end
msg = msg:gsub('${(%u+)}', self._params)
return msg
end
function Blurb:_makeCurrentVersionParameter()
-- A link to the page history or the move log, depending on the kind of
-- protection.
local pagename = self._protectionObj.title.prefixedText
if self._protectionObj.action == 'move' then
-- We need the move log link.
return makeFullUrl(
'Special:Log',
{type = 'move', page = pagename},
self:_getExpandedMessage('current-version-move-display')
)
else
-- We need the history link.
return makeFullUrl(
pagename,
{action = 'history'},
self:_getExpandedMessage('current-version-edit-display')
)
end
end
function Blurb:_makeEditRequestParameter()
local mEditRequest = require('Module:Submit an edit request')
local action = self._protectionObj.action
local level = self._protectionObj.level
-- Get the edit request type.
local requestType
if action == 'edit' then
if level == 'autoconfirmed' then
requestType = 'semi'
elseif level == 'extendedconfirmed' then
requestType = 'extended'
elseif level == 'templateeditor' then
requestType = 'template'
end
end
requestType = requestType or 'full'
-- Get the display value.
local display = self:_getExpandedMessage('edit-request-display')
return mEditRequest._link{type = requestType, display = display}
end
function Blurb:_makeExpiryParameter()
local expiry = self._protectionObj.expiry
if type(expiry) == 'number' then
return self:_formatDate(expiry)
else
return expiry
end
end
function Blurb:_makeExplanationBlurbParameter()
-- Cover special cases first.
if self._protectionObj.title.namespace == 8 then
-- MediaWiki namespace
return self:_getExpandedMessage('explanation-blurb-nounprotect')
end
-- Get explanation blurb table keys
local action = self._protectionObj.action
local level = self._protectionObj.level
local talkKey = self._protectionObj.title.isTalkPage and 'talk' or 'subject'
-- Find the message in the explanation blurb table and substitute any
-- parameters.
local explanations = self._cfg.explanationBlurbs
local msg
if explanations[action][level] and explanations[action][level][talkKey] then
msg = explanations[action][level][talkKey]
elseif explanations[action][level] and explanations[action][level].default then
msg = explanations[action][level].default
elseif explanations[action].default and explanations[action].default[talkKey] then
msg = explanations[action].default[talkKey]
elseif explanations[action].default and explanations[action].default.default then
msg = explanations[action].default.default
else
error(string.format(
'could not find explanation blurb for action "%s", level "%s" and talk key "%s"',
action,
level,
talkKey
), 8)
end
return self:_substituteParameters(msg)
end
function Blurb:_makeImageLinkParameter()
local imageLinks = self._cfg.imageLinks
local action = self._protectionObj.action
local level = self._protectionObj.level
local msg
if imageLinks[action][level] then
msg = imageLinks[action][level]
elseif imageLinks[action].default then
msg = imageLinks[action].default
else
msg = imageLinks.edit.default
end
return self:_substituteParameters(msg)
end
function Blurb:_makeIntroBlurbParameter()
if self._protectionObj:isTemporary() then
return self:_getExpandedMessage('intro-blurb-expiry')
else
return self:_getExpandedMessage('intro-blurb-noexpiry')
end
end
function Blurb:_makeIntroFragmentParameter()
if self._protectionObj:isTemporary() then
return self:_getExpandedMessage('intro-fragment-expiry')
else
return self:_getExpandedMessage('intro-fragment-noexpiry')
end
end
function Blurb:_makePagetypeParameter()
local pagetypes = self._cfg.pagetypes
return pagetypes[self._protectionObj.title.namespace]
or pagetypes.default
or error('no default pagetype defined', 8)
end
function Blurb:_makeProtectionBlurbParameter()
local protectionBlurbs = self._cfg.protectionBlurbs
local action = self._protectionObj.action
local level = self._protectionObj.level
local msg
if protectionBlurbs[action][level] then
msg = protectionBlurbs[action][level]
elseif protectionBlurbs[action].default then
msg = protectionBlurbs[action].default
elseif protectionBlurbs.edit.default then
msg = protectionBlurbs.edit.default
else
error('no protection blurb defined for protectionBlurbs.edit.default', 8)
end
return self:_substituteParameters(msg)
end
function Blurb:_makeProtectionDateParameter()
local protectionDate = self._protectionObj.protectionDate
if type(protectionDate) == 'number' then
return self:_formatDate(protectionDate)
else
return protectionDate
end
end
function Blurb:_makeProtectionLevelParameter()
local protectionLevels = self._cfg.protectionLevels
local action = self._protectionObj.action
local level = self._protectionObj.level
local msg
if protectionLevels[action][level] then
msg = protectionLevels[action][level]
elseif protectionLevels[action].default then
msg = protectionLevels[action].default
elseif protectionLevels.edit.default then
msg = protectionLevels.edit.default
else
error('no protection level defined for protectionLevels.edit.default', 8)
end
return self:_substituteParameters(msg)
end
function Blurb:_makeProtectionLogParameter()
local pagename = self._protectionObj.title.prefixedText
if self._protectionObj.action == 'autoreview' then
-- We need the pending changes log.
return makeFullUrl(
'Special:Log',
{type = 'stable', page = pagename},
self:_getExpandedMessage('pc-log-display')
)
else
-- We need the protection log.
return makeFullUrl(
'Special:Log',
{type = 'protect', page = pagename},
self:_getExpandedMessage('protection-log-display')
)
end
end
function Blurb:_makeTalkPageParameter()
return string.format(
'[[%s:%s#%s|%s]]',
mw.site.namespaces[self._protectionObj.title.namespace].talk.name,
self._protectionObj.title.text,
self._args.section or 'top',
self:_getExpandedMessage('talk-page-link-display')
)
end
function Blurb:_makeTooltipBlurbParameter()
if self._protectionObj:isTemporary() then
return self:_getExpandedMessage('tooltip-blurb-expiry')
else
return self:_getExpandedMessage('tooltip-blurb-noexpiry')
end
end
function Blurb:_makeTooltipFragmentParameter()
if self._protectionObj:isTemporary() then
return self:_getExpandedMessage('tooltip-fragment-expiry')
else
return self:_getExpandedMessage('tooltip-fragment-noexpiry')
end
end
function Blurb:_makeVandalTemplateParameter()
return mw.getCurrentFrame():expandTemplate{
title="vandal-m",
args={self._args.user or self._protectionObj.title.baseText}
}
end
-- Public methods --
function Blurb:makeBannerText(key)
-- Validate input.
if not key or not Blurb.bannerTextFields[key] then
error(string.format(
'"%s" is not a valid banner config field',
tostring(key)
), 2)
end
-- Generate the text.
local msg = self._protectionObj.bannerConfig[key]
if type(msg) == 'string' then
return self:_substituteParameters(msg)
elseif type(msg) == 'function' then
msg = msg(self._protectionObj, self._args)
if type(msg) ~= 'string' then
error(string.format(
'bad output from banner config function with key "%s"'
.. ' (expected string, got %s)',
tostring(key),
type(msg)
), 4)
end
return self:_substituteParameters(msg)
end
end
--------------------------------------------------------------------------------
-- BannerTemplate class
--------------------------------------------------------------------------------
local BannerTemplate = {}
BannerTemplate.__index = BannerTemplate
function BannerTemplate.new(protectionObj, cfg)
local obj = {}
obj._cfg = cfg
-- Set the image filename.
local imageFilename = protectionObj.bannerConfig.image
if imageFilename then
obj._imageFilename = imageFilename
else
-- If an image filename isn't specified explicitly in the banner config,
-- generate it from the protection status and the namespace.
local action = protectionObj.action
local level = protectionObj.level
local namespace = protectionObj.title.namespace
local reason = protectionObj.reason
-- Deal with special cases first.
if (
namespace == 10
or namespace == 828
or reason and obj._cfg.indefImageReasons[reason]
)
and action == 'edit'
and level == 'sysop'
and not protectionObj:isTemporary()
then
-- Fully protected modules and templates get the special red "indef"
-- padlock.
obj._imageFilename = obj._cfg.msg['image-filename-indef']
else
-- Deal with regular protection types.
local images = obj._cfg.images
if images[action] then
if images[action][level] then
obj._imageFilename = images[action][level]
elseif images[action].default then
obj._imageFilename = images[action].default
end
end
end
end
return setmetatable(obj, BannerTemplate)
end
function BannerTemplate:renderImage()
local filename = self._imageFilename
or self._cfg.msg['image-filename-default']
or 'Transparent.gif'
return makeFileLink{
file = filename,
size = (self.imageWidth or 20) .. 'px',
alt = self._imageAlt,
link = self._imageLink,
caption = self.imageCaption
}
end
--------------------------------------------------------------------------------
-- Banner class
--------------------------------------------------------------------------------
local Banner = setmetatable({}, BannerTemplate)
Banner.__index = Banner
function Banner.new(protectionObj, blurbObj, cfg)
local obj = BannerTemplate.new(protectionObj, cfg) -- This doesn't need the blurb.
obj.imageWidth = 40
obj.imageCaption = blurbObj:makeBannerText('alt') -- Large banners use the alt text for the tooltip.
obj._reasonText = blurbObj:makeBannerText('text')
obj._explanationText = blurbObj:makeBannerText('explanation')
obj._page = protectionObj.title.prefixedText -- Only makes a difference in testing.
return setmetatable(obj, Banner)
end
function Banner:__tostring()
-- Renders the banner.
makeMessageBox = makeMessageBox or require('Module:Message box').main
local reasonText = self._reasonText or error('no reason text set', 2)
local explanationText = self._explanationText
local mbargs = {
page = self._page,
type = 'protection',
image = self:renderImage(),
text = string.format(
"'''%s'''%s",
reasonText,
explanationText and '<br />' .. explanationText or ''
)
}
return makeMessageBox('mbox', mbargs)
end
--------------------------------------------------------------------------------
-- Padlock class
--------------------------------------------------------------------------------
local Padlock = setmetatable({}, BannerTemplate)
Padlock.__index = Padlock
function Padlock.new(protectionObj, blurbObj, cfg)
local obj = BannerTemplate.new(protectionObj, cfg) -- This doesn't need the blurb.
obj.imageWidth = 20
obj.imageCaption = blurbObj:makeBannerText('tooltip')
obj._imageAlt = blurbObj:makeBannerText('alt')
obj._imageLink = blurbObj:makeBannerText('link')
obj._indicatorName = cfg.padlockIndicatorNames[protectionObj.action]
or cfg.padlockIndicatorNames.default
or 'pp-default'
return setmetatable(obj, Padlock)
end
function Padlock:__tostring()
local frame = mw.getCurrentFrame()
-- The nowiki tag helps prevent whitespace at the top of articles.
return frame:extensionTag{name = 'nowiki'} .. frame:extensionTag{
name = 'indicator',
args = {name = self._indicatorName},
content = self:renderImage()
}
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
local p = {}
function p._exportClasses()
-- This is used for testing purposes.
return {
Protection = Protection,
Blurb = Blurb,
BannerTemplate = BannerTemplate,
Banner = Banner,
Padlock = Padlock,
}
end
function p._main(args, cfg, title)
args = args or {}
cfg = cfg or require(CONFIG_MODULE)
local protectionObj = Protection.new(args, cfg, title)
local ret = {}
-- If a page's edit protection is equally or more restrictive than its
-- protection from some other action, then don't bother displaying anything
-- for the other action (except categories).
if not yesno(args.catonly) and (protectionObj.action == 'edit' or
args.demolevel or
not getReachableNodes(
cfg.hierarchy,
protectionObj.level
)[effectiveProtectionLevel('edit', protectionObj.title)])
then
-- Initialise the blurb object
local blurbObj = Blurb.new(protectionObj, args, cfg)
-- Render the banner
if protectionObj:shouldShowLock() then
ret[#ret + 1] = tostring(
(yesno(args.small) and Padlock or Banner)
.new(protectionObj, blurbObj, cfg)
)
end
end
-- Render the categories
if yesno(args.category) ~= false then
ret[#ret + 1] = protectionObj:makeCategoryLinks()
end
return table.concat(ret)
end
function p.main(frame, cfg)
cfg = cfg or require(CONFIG_MODULE)
-- Find default args, if any.
local parent = frame.getParent and frame:getParent()
local defaultArgs = parent and cfg.wrappers[parent:getTitle():gsub('/sandbox$', '')]
-- Find user args, and use the parent frame if we are being called from a
-- wrapper template.
getArgs = getArgs or require('Module:Arguments').getArgs
local userArgs = getArgs(frame, {
parentOnly = defaultArgs,
frameOnly = not defaultArgs
})
-- Build the args table. User-specified args overwrite default args.
local args = {}
for k, v in pairs(defaultArgs or {}) do
args[k] = v
end
for k, v in pairs(userArgs) do
args[k] = v
end
return p._main(args, cfg)
end
return p
894f0884d4c2da1ce19d385b96f59af654b0946a
Module:Protection banner/config
828
67
94
93
2024-03-26T22:29:47Z
Vicht
1
1 revision imported
Scribunto
text/plain
-- This module provides configuration data for [[Module:Protection banner]].
return {
--------------------------------------------------------------------------------
--
-- BANNER DATA
--
--------------------------------------------------------------------------------
--[[
-- Banner data consists of six fields:
-- * text - the main protection text that appears at the top of protection
-- banners.
-- * explanation - the text that appears below the main protection text, used
-- to explain the details of the protection.
-- * tooltip - the tooltip text you see when you move the mouse over a small
-- padlock icon.
-- * link - the page that the small padlock icon links to.
-- * alt - the alt text for the small padlock icon. This is also used as tooltip
-- text for the large protection banners.
-- * image - the padlock image used in both protection banners and small padlock
-- icons.
--
-- The module checks in three separate tables to find a value for each field.
-- First it checks the banners table, which has values specific to the reason
-- for the page being protected. Then the module checks the defaultBanners
-- table, which has values specific to each protection level. Finally, the
-- module checks the masterBanner table, which holds data for protection
-- templates to use if no data has been found in the previous two tables.
--
-- The values in the banner data can take parameters. These are specified
-- using ${TEXTLIKETHIS} (a dollar sign preceding a parameter name
-- enclosed in curly braces).
--
-- Available parameters:
--
-- ${CURRENTVERSION} - a link to the page history or the move log, with the
-- display message "current-version-edit-display" or
-- "current-version-move-display".
--
-- ${EDITREQUEST} - a link to create an edit request for the current page.
--
-- ${EXPLANATIONBLURB} - an explanation blurb, e.g. "Please discuss any changes
-- on the talk page; you may submit a request to ask an administrator to make
-- an edit if it is minor or supported by consensus."
--
-- ${IMAGELINK} - a link to set the image to, depending on the protection
-- action and protection level.
--
-- ${INTROBLURB} - the PROTECTIONBLURB parameter, plus the expiry if an expiry
-- is set. E.g. "Editing of this page by new or unregistered users is currently
-- disabled until dd Month YYYY."
--
-- ${INTROFRAGMENT} - the same as ${INTROBLURB}, but without final punctuation
-- so that it can be used in run-on sentences.
--
-- ${PAGETYPE} - the type of the page, e.g. "article" or "template".
-- Defined in the cfg.pagetypes table.
--
-- ${PROTECTIONBLURB} - a blurb explaining the protection level of the page, e.g.
-- "Editing of this page by new or unregistered users is currently disabled"
--
-- ${PROTECTIONDATE} - the protection date, if it has been supplied to the
-- template.
--
-- ${PROTECTIONLEVEL} - the protection level, e.g. "fully protected" or
-- "semi-protected".
--
-- ${PROTECTIONLOG} - a link to the protection log or the pending changes log,
-- depending on the protection action.
--
-- ${TALKPAGE} - a link to the talk page. If a section is specified, links
-- straight to that talk page section.
--
-- ${TOOLTIPBLURB} - uses the PAGETYPE, PROTECTIONTYPE and EXPIRY parameters to
-- create a blurb like "This template is semi-protected", or "This article is
-- move-protected until DD Month YYYY".
--
-- ${VANDAL} - links for the specified username (or the root page name)
-- using Module:Vandal-m.
--
-- Functions
--
-- For advanced users, it is possible to use Lua functions instead of strings
-- in the banner config tables. Using functions gives flexibility that is not
-- possible just by using parameters. Functions take two arguments, the
-- protection object and the template arguments, and they must output a string.
--
-- For example:
--
-- text = function (protectionObj, args)
-- if protectionObj.level == 'autoconfirmed' then
-- return 'foo'
-- else
-- return 'bar'
-- end
-- end
--
-- Some protection object properties and methods that may be useful:
-- protectionObj.action - the protection action
-- protectionObj.level - the protection level
-- protectionObj.reason - the protection reason
-- protectionObj.expiry - the expiry. Nil if unset, the string "indef" if set
-- to indefinite, and the protection time in unix time if temporary.
-- protectionObj.protectionDate - the protection date in unix time, or nil if
-- unspecified.
-- protectionObj.bannerConfig - the banner config found by the module. Beware
-- of editing the config field used by the function, as it could create an
-- infinite loop.
-- protectionObj:isProtected - returns a boolean showing whether the page is
-- protected.
-- protectionObj:isTemporary - returns a boolean showing whether the expiry is
-- temporary.
-- protectionObj:isIncorrect - returns a boolean showing whether the protection
-- template is incorrect.
--]]
-- The master banner data, used if no values have been found in banners or
-- defaultBanners.
masterBanner = {
text = '${INTROBLURB}',
explanation = '${EXPLANATIONBLURB}',
tooltip = '${TOOLTIPBLURB}',
link = '${IMAGELINK}',
alt = 'Page ${PROTECTIONLEVEL}'
},
-- The default banner data. This holds banner data for different protection
-- levels.
-- *required* - this table needs edit, move, autoreview and upload subtables.
defaultBanners = {
edit = {},
move = {},
autoreview = {
default = {
alt = 'Page protected with pending changes',
tooltip = 'All edits by unregistered and new users are subject to review prior to becoming visible to unregistered users',
image = 'Pending-protection-shackle.svg'
}
},
upload = {}
},
-- The banner data. This holds banner data for different protection reasons.
-- In fact, the reasons specified in this table control which reasons are
-- valid inputs to the first positional parameter.
--
-- There is also a non-standard "description" field that can be used for items
-- in this table. This is a description of the protection reason for use in the
-- module documentation.
--
-- *required* - this table needs edit, move, autoreview and upload subtables.
banners = {
edit = {
blp = {
description = 'For pages protected to promote compliance with the'
.. ' [[Wikipedia:Biographies of living persons'
.. '|biographies of living persons]] policy',
text = '${INTROFRAGMENT} to promote compliance with'
.. ' [[Wikipedia:Biographies of living persons'
.. "|Wikipedia's policy on the biographies"
.. ' of living people]].',
tooltip = '${TOOLTIPFRAGMENT} to promote compliance with the policy on'
.. ' biographies of living persons',
},
dmca = {
description = 'For pages protected by the Wikimedia Foundation'
.. ' due to [[Digital Millennium Copyright Act]] takedown requests',
explanation = function (protectionObj, args)
local ret = 'Pursuant to a rights owner notice under the Digital'
.. ' Millennium Copyright Act (DMCA) regarding some content'
.. ' in this article, the Wikimedia Foundation acted under'
.. ' applicable law and took down and restricted the content'
.. ' in question.'
if args.notice then
ret = ret .. ' A copy of the received notice can be found here: '
.. args.notice .. '.'
end
ret = ret .. ' For more information, including websites discussing'
.. ' how to file a counter-notice, please see'
.. " [[Wikipedia:Office actions]] and the article's ${TALKPAGE}."
.. "'''Do not remove this template from the article until the"
.. " restrictions are withdrawn'''."
return ret
end,
image = 'Office-protection-shackle.svg',
},
dispute = {
description = 'For pages protected due to editing disputes',
text = function (protectionObj, args)
-- Find the value of "disputes".
local display = 'disputes'
local disputes
if args.section then
disputes = string.format(
'[[%s:%s#%s|%s]]',
mw.site.namespaces[protectionObj.title.namespace].talk.name,
protectionObj.title.text,
args.section,
display
)
else
disputes = display
end
-- Make the blurb, depending on the expiry.
local msg
if type(protectionObj.expiry) == 'number' then
msg = '${INTROFRAGMENT} or until editing %s have been resolved.'
else
msg = '${INTROFRAGMENT} until editing %s have been resolved.'
end
return string.format(msg, disputes)
end,
explanation = "This protection is '''not''' an endorsement of the"
.. ' ${CURRENTVERSION}. ${EXPLANATIONBLURB}',
tooltip = '${TOOLTIPFRAGMENT} due to editing disputes',
},
ecp = {
description = 'For articles in topic areas authorized by'
.. ' [[Wikipedia:Arbitration Committee|ArbCom]] or'
.. ' meets the criteria for community use',
tooltip = 'This ${PAGETYPE} is ${PROTECTIONLEVEL}',
alt = 'Extended-protected ${PAGETYPE}',
},
mainpage = {
description = 'For pages protected for being displayed on the [[Main Page]]',
text = 'This file is currently'
.. ' [[Wikipedia:This page is protected|protected]] from'
.. ' editing because it is currently or will soon be displayed'
.. ' on the [[Main Page]].',
explanation = 'Images on the Main Page are protected due to their high'
.. ' visibility. Please discuss any necessary changes on the ${TALKPAGE}.'
.. '<br /><span style="font-size:90%;">'
.. "'''Administrators:''' Once this image is definitely off the Main Page,"
.. ' please unprotect this file, or reduce to semi-protection,'
.. ' as appropriate.</span>',
},
office = {
description = 'For pages protected by the Wikimedia Foundation',
text = function (protectionObj, args)
local ret = 'This ${PAGETYPE} is currently under the'
.. ' scrutiny of the'
.. ' [[Wikipedia:Office actions|Wikimedia Foundation Office]]'
.. ' and is protected.'
if protectionObj.protectionDate then
ret = ret .. ' It has been protected since ${PROTECTIONDATE}.'
end
return ret
end,
explanation = "If you can edit this page, please discuss all changes and"
.. " additions on the ${TALKPAGE} first. '''Do not remove protection from this"
.. " page unless you are authorized by the Wikimedia Foundation to do"
.. " so.'''",
image = 'Office-protection-shackle.svg',
},
reset = {
description = 'For pages protected by the Wikimedia Foundation and'
.. ' "reset" to a bare-bones version',
text = 'This ${PAGETYPE} is currently under the'
.. ' scrutiny of the'
.. ' [[Wikipedia:Office actions|Wikimedia Foundation Office]]'
.. ' and is protected.',
explanation = function (protectionObj, args)
local ret = ''
if protectionObj.protectionDate then
ret = ret .. 'On ${PROTECTIONDATE} this ${PAGETYPE} was'
else
ret = ret .. 'This ${PAGETYPE} has been'
end
ret = ret .. ' reduced to a'
.. ' simplified, "bare bones" version so that it may be completely'
.. ' rewritten to ensure it meets the policies of'
.. ' [[WP:NPOV|Neutral Point of View]] and [[WP:V|Verifiability]].'
.. ' Standard Wikipedia policies will apply to its rewriting—which'
.. ' will eventually be open to all editors—and will be strictly'
.. ' enforced. The ${PAGETYPE} has been ${PROTECTIONLEVEL} while'
.. ' it is being rebuilt.\n\n'
.. 'Any insertion of material directly from'
.. ' pre-protection revisions of the ${PAGETYPE} will be removed, as'
.. ' will any material added to the ${PAGETYPE} that is not properly'
.. ' sourced. The associated talk page(s) were also cleared on the'
.. " same date.\n\n"
.. "If you can edit this page, please discuss all changes and"
.. " additions on the ${TALKPAGE} first. '''Do not override"
.. " this action, and do not remove protection from this page,"
.. " unless you are authorized by the Wikimedia Foundation"
.. " to do so. No editor may remove this notice.'''"
return ret
end,
image = 'Office-protection-shackle.svg',
},
sock = {
description = 'For pages protected due to'
.. ' [[Wikipedia:Sock puppetry|sock puppetry]]',
text = '${INTROFRAGMENT} to prevent [[Wikipedia:Sock puppetry|sock puppets]] of'
.. ' [[Wikipedia:Blocking policy|blocked]] or'
.. ' [[Wikipedia:Banning policy|banned users]]'
.. ' from editing it.',
tooltip = '${TOOLTIPFRAGMENT} to prevent sock puppets of blocked or banned users from'
.. ' editing it',
},
template = {
description = 'For [[Wikipedia:High-risk templates|high-risk]]'
.. ' templates and Lua modules',
text = 'This is a permanently [[Help:Protection|protected]] ${PAGETYPE},'
.. ' as it is [[Wikipedia:High-risk templates|high-risk]].',
explanation = 'Please discuss any changes on the ${TALKPAGE}; you may'
.. ' ${EDITREQUEST} to ask an'
.. ' [[Wikipedia:Administrators|administrator]] or'
.. ' [[Wikipedia:Template editor|template editor]] to make an edit if'
.. ' it is [[Help:Minor edit#When to mark an edit as a minor edit'
.. '|uncontroversial]] or supported by'
.. ' [[Wikipedia:Consensus|consensus]]. You can also'
.. ' [[Wikipedia:Requests for page protection|request]] that the page be'
.. ' unprotected.',
tooltip = 'This high-risk ${PAGETYPE} is permanently ${PROTECTIONLEVEL}'
.. ' to prevent vandalism',
alt = 'Permanently protected ${PAGETYPE}',
},
usertalk = {
description = 'For pages protected against disruptive edits by a'
.. ' particular user',
text = '${INTROFRAGMENT} to prevent ${VANDAL} from using it to make disruptive edits,'
.. ' such as abusing the'
.. ' {{[[Template:unblock|unblock]]}} template.',
explanation = 'If you cannot edit this user talk page and you need to'
.. ' make a change or leave a message, you can'
.. ' [[Wikipedia:Requests for page protection'
.. '#Current requests for edits to a protected page'
.. '|request an edit]],'
.. ' [[Wikipedia:Requests for page protection'
.. '#Current requests for reduction in protection level'
.. '|request unprotection]],'
.. ' [[Special:Userlogin|log in]],'
.. ' or [[Special:UserLogin/signup|create an account]].',
},
vandalism = {
description = 'For pages protected against'
.. ' [[Wikipedia:Vandalism|vandalism]]',
text = '${INTROFRAGMENT} due to [[Wikipedia:Vandalism|vandalism]].',
explanation = function (protectionObj, args)
local ret = ''
if protectionObj.level == 'sysop' then
ret = ret .. "This protection is '''not''' an endorsement of the"
.. ' ${CURRENTVERSION}. '
end
return ret .. '${EXPLANATIONBLURB}'
end,
tooltip = '${TOOLTIPFRAGMENT} due to vandalism',
}
},
move = {
dispute = {
description = 'For pages protected against page moves due to'
.. ' disputes over the page title',
explanation = "This protection is '''not''' an endorsement of the"
.. ' ${CURRENTVERSION}. ${EXPLANATIONBLURB}',
image = 'Move-protection-shackle.svg'
},
vandalism = {
description = 'For pages protected against'
.. ' [[Wikipedia:Vandalism#Page-move vandalism'
.. ' |page-move vandalism]]'
}
},
autoreview = {},
upload = {}
},
--------------------------------------------------------------------------------
--
-- GENERAL DATA TABLES
--
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
-- Protection blurbs
--------------------------------------------------------------------------------
-- This table produces the protection blurbs available with the
-- ${PROTECTIONBLURB} parameter. It is sorted by protection action and
-- protection level, and is checked by the module in the following order:
-- 1. page's protection action, page's protection level
-- 2. page's protection action, default protection level
-- 3. "edit" protection action, default protection level
--
-- It is possible to use banner parameters inside this table.
-- *required* - this table needs edit, move, autoreview and upload subtables.
protectionBlurbs = {
edit = {
default = 'This ${PAGETYPE} is currently [[Help:Protection|'
.. 'protected]] from editing',
autoconfirmed = 'Editing of this ${PAGETYPE} by [[Wikipedia:User access'
.. ' levels#New users|new]] or [[Wikipedia:User access levels#Unregistered'
.. ' users|unregistered]] users is currently [[Help:Protection|disabled]]',
extendedconfirmed = 'This ${PAGETYPE} is currently under extended confirmed protection',
},
move = {
default = 'This ${PAGETYPE} is currently [[Help:Protection|protected]]'
.. ' from [[Help:Moving a page|page moves]]'
},
autoreview = {
default = 'All edits made to this ${PAGETYPE} by'
.. ' [[Wikipedia:User access levels#New users|new]] or'
.. ' [[Wikipedia:User access levels#Unregistered users|unregistered]]'
.. ' users are currently'
.. ' [[Wikipedia:Pending changes|subject to review]]'
},
upload = {
default = 'Uploading new versions of this ${PAGETYPE} is currently disabled'
}
},
--------------------------------------------------------------------------------
-- Explanation blurbs
--------------------------------------------------------------------------------
-- This table produces the explanation blurbs available with the
-- ${EXPLANATIONBLURB} parameter. It is sorted by protection action,
-- protection level, and whether the page is a talk page or not. If the page is
-- a talk page it will have a talk key of "talk"; otherwise it will have a talk
-- key of "subject". The table is checked in the following order:
-- 1. page's protection action, page's protection level, page's talk key
-- 2. page's protection action, page's protection level, default talk key
-- 3. page's protection action, default protection level, page's talk key
-- 4. page's protection action, default protection level, default talk key
--
-- It is possible to use banner parameters inside this table.
-- *required* - this table needs edit, move, autoreview and upload subtables.
explanationBlurbs = {
edit = {
autoconfirmed = {
subject = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details. If you'
.. ' cannot edit this ${PAGETYPE} and you wish to make a change, you can'
.. ' ${EDITREQUEST}, discuss changes on the ${TALKPAGE},'
.. ' [[Wikipedia:Requests for page protection'
.. '#Current requests for reduction in protection level'
.. '|request unprotection]], [[Special:Userlogin|log in]], or'
.. ' [[Special:UserLogin/signup|create an account]].',
default = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details. If you'
.. ' cannot edit this ${PAGETYPE} and you wish to make a change, you can'
.. ' [[Wikipedia:Requests for page protection'
.. '#Current requests for reduction in protection level'
.. '|request unprotection]], [[Special:Userlogin|log in]], or'
.. ' [[Special:UserLogin/signup|create an account]].',
},
extendedconfirmed = {
default = 'Extended confirmed protection prevents edits from all unregistered editors'
.. ' and registered users with fewer than 30 days tenure and 500 edits.'
.. ' The [[Wikipedia:Protection policy#extended|policy on community use]]'
.. ' specifies that extended confirmed protection can be applied to combat'
.. ' disruption, if semi-protection has proven to be ineffective.'
.. ' Extended confirmed protection may also be applied to enforce'
.. ' [[Wikipedia:Arbitration Committee|arbitration sanctions]].'
.. ' Please discuss any changes on the ${TALKPAGE}; you may'
.. ' ${EDITREQUEST} to ask for uncontroversial changes supported by'
.. ' [[Wikipedia:Consensus|consensus]].'
},
default = {
subject = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' Please discuss any changes on the ${TALKPAGE}; you'
.. ' may ${EDITREQUEST} to ask an'
.. ' [[Wikipedia:Administrators|administrator]] to make an edit if it'
.. ' is [[Help:Minor edit#When to mark an edit as a minor edit'
.. '|uncontroversial]] or supported by [[Wikipedia:Consensus'
.. '|consensus]]. You may also [[Wikipedia:Requests for'
.. ' page protection#Current requests for reduction in protection level'
.. '|request]] that this page be unprotected.',
default = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' You may [[Wikipedia:Requests for page'
.. ' protection#Current requests for edits to a protected page|request an'
.. ' edit]] to this page, or [[Wikipedia:Requests for'
.. ' page protection#Current requests for reduction in protection level'
.. '|ask]] for it to be unprotected.'
}
},
move = {
default = {
subject = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' The page may still be edited but cannot be moved'
.. ' until unprotected. Please discuss any suggested moves on the'
.. ' ${TALKPAGE} or at [[Wikipedia:Requested moves]]. You can also'
.. ' [[Wikipedia:Requests for page protection|request]] that the page be'
.. ' unprotected.',
default = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' The page may still be edited but cannot be moved'
.. ' until unprotected. Please discuss any suggested moves at'
.. ' [[Wikipedia:Requested moves]]. You can also'
.. ' [[Wikipedia:Requests for page protection|request]] that the page be'
.. ' unprotected.'
}
},
autoreview = {
default = {
default = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' Edits to this ${PAGETYPE} by new and unregistered users'
.. ' will not be visible to readers until they are accepted by'
.. ' a reviewer. To avoid the need for your edits to be'
.. ' reviewed, you may'
.. ' [[Wikipedia:Requests for page protection'
.. '#Current requests for reduction in protection level'
.. '|request unprotection]], [[Special:Userlogin|log in]], or'
.. ' [[Special:UserLogin/signup|create an account]].'
},
},
upload = {
default = {
default = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' The page may still be edited but new versions of the file'
.. ' cannot be uploaded until it is unprotected. You can'
.. ' request that a new version be uploaded by using a'
.. ' [[Wikipedia:Edit requests|protected edit request]], or you'
.. ' can [[Wikipedia:Requests for page protection|request]]'
.. ' that the file be unprotected.'
}
}
},
--------------------------------------------------------------------------------
-- Protection levels
--------------------------------------------------------------------------------
-- This table provides the data for the ${PROTECTIONLEVEL} parameter, which
-- produces a short label for different protection levels. It is sorted by
-- protection action and protection level, and is checked in the following
-- order:
-- 1. page's protection action, page's protection level
-- 2. page's protection action, default protection level
-- 3. "edit" protection action, default protection level
--
-- It is possible to use banner parameters inside this table.
-- *required* - this table needs edit, move, autoreview and upload subtables.
protectionLevels = {
edit = {
default = 'protected',
templateeditor = 'template-protected',
extendedconfirmed = 'extended-protected',
autoconfirmed = 'semi-protected',
},
move = {
default = 'move-protected'
},
autoreview = {
},
upload = {
default = 'upload-protected'
}
},
--------------------------------------------------------------------------------
-- Images
--------------------------------------------------------------------------------
-- This table lists different padlock images for each protection action and
-- protection level. It is used if an image is not specified in any of the
-- banner data tables, and if the page does not satisfy the conditions for using
-- the ['image-filename-indef'] image. It is checked in the following order:
-- 1. page's protection action, page's protection level
-- 2. page's protection action, default protection level
images = {
edit = {
default = 'Full-protection-shackle.svg',
templateeditor = 'Template-protection-shackle.svg',
extendedconfirmed = 'Extended-protection-shackle.svg',
autoconfirmed = 'Semi-protection-shackle.svg'
},
move = {
default = 'Move-protection-shackle.svg',
},
autoreview = {
default = 'Pending-protection-shackle.svg'
},
upload = {
default = 'Upload-protection-shackle.svg'
}
},
-- Pages with a reason specified in this table will show the special "indef"
-- padlock, defined in the 'image-filename-indef' message, if no expiry is set.
indefImageReasons = {
template = true
},
--------------------------------------------------------------------------------
-- Image links
--------------------------------------------------------------------------------
-- This table provides the data for the ${IMAGELINK} parameter, which gets
-- the image link for small padlock icons based on the page's protection action
-- and protection level. It is checked in the following order:
-- 1. page's protection action, page's protection level
-- 2. page's protection action, default protection level
-- 3. "edit" protection action, default protection level
--
-- It is possible to use banner parameters inside this table.
-- *required* - this table needs edit, move, autoreview and upload subtables.
imageLinks = {
edit = {
default = 'Wikipedia:Protection policy#full',
templateeditor = 'Wikipedia:Protection policy#template',
extendedconfirmed = 'Wikipedia:Protection policy#extended',
autoconfirmed = 'Wikipedia:Protection policy#semi'
},
move = {
default = 'Wikipedia:Protection policy#move'
},
autoreview = {
default = 'Wikipedia:Protection policy#pending'
},
upload = {
default = 'Wikipedia:Protection policy#upload'
}
},
--------------------------------------------------------------------------------
-- Padlock indicator names
--------------------------------------------------------------------------------
-- This table provides the "name" attribute for the <indicator> extension tag
-- with which small padlock icons are generated. All indicator tags on a page
-- are displayed in alphabetical order based on this attribute, and with
-- indicator tags with duplicate names, the last tag on the page wins.
-- The attribute is chosen based on the protection action; table keys must be a
-- protection action name or the string "default".
padlockIndicatorNames = {
autoreview = 'pp-autoreview',
default = 'pp-default'
},
--------------------------------------------------------------------------------
-- Protection categories
--------------------------------------------------------------------------------
--[[
-- The protection categories are stored in the protectionCategories table.
-- Keys to this table are made up of the following strings:
--
-- 1. the expiry date
-- 2. the namespace
-- 3. the protection reason (e.g. "dispute" or "vandalism")
-- 4. the protection level (e.g. "sysop" or "autoconfirmed")
-- 5. the action (e.g. "edit" or "move")
--
-- When the module looks up a category in the table, first it will will check to
-- see a key exists that corresponds to all five parameters. For example, a
-- user page semi-protected from vandalism for two weeks would have the key
-- "temp-user-vandalism-autoconfirmed-edit". If no match is found, the module
-- changes the first part of the key to "all" and checks the table again. It
-- keeps checking increasingly generic key combinations until it finds the
-- field, or until it reaches the key "all-all-all-all-all".
--
-- The module uses a binary matrix to determine the order in which to search.
-- This is best demonstrated by a table. In this table, the "0" values
-- represent "all", and the "1" values represent the original data (e.g.
-- "indef" or "file" or "vandalism").
--
-- expiry namespace reason level action
-- order
-- 1 1 1 1 1 1
-- 2 0 1 1 1 1
-- 3 1 0 1 1 1
-- 4 0 0 1 1 1
-- 5 1 1 0 1 1
-- 6 0 1 0 1 1
-- 7 1 0 0 1 1
-- 8 0 0 0 1 1
-- 9 1 1 1 0 1
-- 10 0 1 1 0 1
-- 11 1 0 1 0 1
-- 12 0 0 1 0 1
-- 13 1 1 0 0 1
-- 14 0 1 0 0 1
-- 15 1 0 0 0 1
-- 16 0 0 0 0 1
-- 17 1 1 1 1 0
-- 18 0 1 1 1 0
-- 19 1 0 1 1 0
-- 20 0 0 1 1 0
-- 21 1 1 0 1 0
-- 22 0 1 0 1 0
-- 23 1 0 0 1 0
-- 24 0 0 0 1 0
-- 25 1 1 1 0 0
-- 26 0 1 1 0 0
-- 27 1 0 1 0 0
-- 28 0 0 1 0 0
-- 29 1 1 0 0 0
-- 30 0 1 0 0 0
-- 31 1 0 0 0 0
-- 32 0 0 0 0 0
--
-- In this scheme the action has the highest priority, as it is the last
-- to change, and the expiry has the least priority, as it changes the most.
-- The priorities of the expiry, the protection level and the action are
-- fixed, but the priorities of the reason and the namespace can be swapped
-- through the use of the cfg.bannerDataNamespaceHasPriority table.
--]]
-- If the reason specified to the template is listed in this table,
-- namespace data will take priority over reason data in the protectionCategories
-- table.
reasonsWithNamespacePriority = {
vandalism = true,
},
-- The string to use as a namespace key for the protectionCategories table for each
-- namespace number.
categoryNamespaceKeys = {
[ 2] = 'user',
[ 3] = 'user',
[ 4] = 'project',
[ 6] = 'file',
[ 8] = 'mediawiki',
[ 10] = 'template',
[ 12] = 'project',
[ 14] = 'category',
[100] = 'portal',
[828] = 'module',
},
protectionCategories = {
['all|all|all|all|all'] = 'Wikipedia fully protected pages',
['all|all|office|all|all'] = 'Wikipedia Office-protected pages',
['all|all|reset|all|all'] = 'Wikipedia Office-protected pages',
['all|all|dmca|all|all'] = 'Wikipedia Office-protected pages',
['all|all|mainpage|all|all'] = 'Wikipedia fully protected main page files',
['all|all|all|extendedconfirmed|all'] = 'Wikipedia extended-confirmed-protected pages',
['all|all|ecp|extendedconfirmed|all'] = 'Wikipedia extended-confirmed-protected pages',
['all|template|all|all|edit'] = 'Wikipedia fully protected templates',
['all|all|all|autoconfirmed|edit'] = 'Wikipedia semi-protected pages',
['indef|all|all|autoconfirmed|edit'] = 'Wikipedia indefinitely semi-protected pages',
['all|all|blp|autoconfirmed|edit'] = 'Wikipedia indefinitely semi-protected biographies of living people',
['temp|all|blp|autoconfirmed|edit'] = 'Wikipedia temporarily semi-protected biographies of living people',
['all|all|dispute|autoconfirmed|edit'] = 'Wikipedia pages semi-protected due to dispute',
['all|all|sock|autoconfirmed|edit'] = 'Wikipedia pages semi-protected from banned users',
['all|all|vandalism|autoconfirmed|edit'] = 'Wikipedia pages semi-protected against vandalism',
['all|category|all|autoconfirmed|edit'] = 'Wikipedia semi-protected categories',
['all|file|all|autoconfirmed|edit'] = 'Wikipedia semi-protected files',
['all|portal|all|autoconfirmed|edit'] = 'Wikipedia semi-protected portals',
['all|project|all|autoconfirmed|edit'] = 'Wikipedia semi-protected project pages',
['all|talk|all|autoconfirmed|edit'] = 'Wikipedia semi-protected talk pages',
['all|template|all|autoconfirmed|edit'] = 'Wikipedia semi-protected templates',
['all|user|all|autoconfirmed|edit'] = 'Wikipedia semi-protected user and user talk pages',
['all|all|all|templateeditor|move'] = 'Wikipedia template-protected pages other than templates and modules',
['all|all|all|templateeditor|edit'] = 'Wikipedia template-protected pages other than templates and modules',
['all|template|all|templateeditor|edit'] = 'Wikipedia template-protected templates',
['all|template|all|templateeditor|move'] = 'Wikipedia template-protected templates', -- move-protected templates
['all|all|blp|sysop|edit'] = 'Wikipedia indefinitely protected biographies of living people',
['temp|all|blp|sysop|edit'] = 'Wikipedia temporarily protected biographies of living people',
['all|all|dispute|sysop|edit'] = 'Wikipedia pages protected due to dispute',
['all|all|sock|sysop|edit'] = 'Wikipedia pages protected from banned users',
['all|all|vandalism|sysop|edit'] = 'Wikipedia pages protected against vandalism',
['all|category|all|sysop|edit'] = 'Wikipedia fully protected categories',
['all|file|all|sysop|edit'] = 'Wikipedia fully protected files',
['all|project|all|sysop|edit'] = 'Wikipedia fully protected project pages',
['all|talk|all|sysop|edit'] = 'Wikipedia fully protected talk pages',
['all|template|all|extendedconfirmed|edit'] = 'Wikipedia extended-confirmed-protected templates',
['all|template|all|sysop|edit'] = 'Wikipedia fully protected templates',
['all|user|all|sysop|edit'] = 'Wikipedia fully protected user and user talk pages',
['all|module|all|all|edit'] = 'Wikipedia fully protected modules',
['all|module|all|templateeditor|edit'] = 'Wikipedia template-protected modules',
['all|module|all|extendedconfirmed|edit'] = 'Wikipedia extended-confirmed-protected modules',
['all|module|all|autoconfirmed|edit'] = 'Wikipedia semi-protected modules',
['all|all|all|sysop|move'] = 'Wikipedia move-protected pages',
['indef|all|all|sysop|move'] = 'Wikipedia indefinitely move-protected pages',
['all|all|dispute|sysop|move'] = 'Wikipedia pages move-protected due to dispute',
['all|all|vandalism|sysop|move'] = 'Wikipedia pages move-protected due to vandalism',
['all|portal|all|sysop|move'] = 'Wikipedia move-protected portals',
['all|project|all|sysop|move'] = 'Wikipedia move-protected project pages',
['all|talk|all|sysop|move'] = 'Wikipedia move-protected talk pages',
['all|template|all|sysop|move'] = 'Wikipedia move-protected templates',
['all|user|all|sysop|move'] = 'Wikipedia move-protected user and user talk pages',
['all|all|all|autoconfirmed|autoreview'] = 'Wikipedia pending changes protected pages',
['all|file|all|all|upload'] = 'Wikipedia upload-protected files',
},
--------------------------------------------------------------------------------
-- Expiry category config
--------------------------------------------------------------------------------
-- This table configures the expiry category behaviour for each protection
-- action.
-- * If set to true, setting that action will always categorise the page if
-- an expiry parameter is not set.
-- * If set to false, setting that action will never categorise the page.
-- * If set to nil, the module will categorise the page if:
-- 1) an expiry parameter is not set, and
-- 2) a reason is provided, and
-- 3) the specified reason is not blacklisted in the reasonsWithoutExpiryCheck
-- table.
expiryCheckActions = {
edit = nil,
move = false,
autoreview = true,
upload = false
},
reasonsWithoutExpiryCheck = {
blp = true,
template = true,
},
--------------------------------------------------------------------------------
-- Pagetypes
--------------------------------------------------------------------------------
-- This table produces the page types available with the ${PAGETYPE} parameter.
-- Keys are namespace numbers, or the string "default" for the default value.
pagetypes = {
[0] = 'article',
[6] = 'file',
[10] = 'template',
[14] = 'category',
[828] = 'module',
default = 'page'
},
--------------------------------------------------------------------------------
-- Strings marking indefinite protection
--------------------------------------------------------------------------------
-- This table contains values passed to the expiry parameter that mean the page
-- is protected indefinitely.
indefStrings = {
['indef'] = true,
['indefinite'] = true,
['indefinitely'] = true,
['infinite'] = true,
},
--------------------------------------------------------------------------------
-- Group hierarchy
--------------------------------------------------------------------------------
-- This table maps each group to all groups that have a superset of the original
-- group's page editing permissions.
hierarchy = {
sysop = {},
reviewer = {'sysop'},
filemover = {'sysop'},
templateeditor = {'sysop'},
extendedconfirmed = {'sysop'},
autoconfirmed = {'reviewer', 'filemover', 'templateeditor', 'extendedconfirmed'},
user = {'autoconfirmed'},
['*'] = {'user'}
},
--------------------------------------------------------------------------------
-- Wrapper templates and their default arguments
--------------------------------------------------------------------------------
-- This table contains wrapper templates used with the module, and their
-- default arguments. Templates specified in this table should contain the
-- following invocation, and no other template content:
--
-- {{#invoke:Protection banner|main}}
--
-- If other content is desired, it can be added between
-- <noinclude>...</noinclude> tags.
--
-- When a user calls one of these wrapper templates, they will use the
-- default arguments automatically. However, users can override any of the
-- arguments.
wrappers = {
['Template:Pp'] = {},
['Template:Pp-extended'] = {'ecp'},
['Template:Pp-blp'] = {'blp'},
-- we don't need Template:Pp-create
['Template:Pp-dispute'] = {'dispute'},
['Template:Pp-main-page'] = {'mainpage'},
['Template:Pp-move'] = {action = 'move', catonly = 'yes'},
['Template:Pp-move-dispute'] = {'dispute', action = 'move', catonly = 'yes'},
-- we don't need Template:Pp-move-indef
['Template:Pp-move-vandalism'] = {'vandalism', action = 'move', catonly = 'yes'},
['Template:Pp-office'] = {'office'},
['Template:Pp-office-dmca'] = {'dmca'},
['Template:Pp-pc'] = {action = 'autoreview', small = true},
['Template:Pp-pc1'] = {action = 'autoreview', small = true},
['Template:Pp-reset'] = {'reset'},
['Template:Pp-semi-indef'] = {small = true},
['Template:Pp-sock'] = {'sock'},
['Template:Pp-template'] = {'template', small = true},
['Template:Pp-upload'] = {action = 'upload'},
['Template:Pp-usertalk'] = {'usertalk'},
['Template:Pp-vandalism'] = {'vandalism'},
},
--------------------------------------------------------------------------------
--
-- MESSAGES
--
--------------------------------------------------------------------------------
msg = {
--------------------------------------------------------------------------------
-- Intro blurb and intro fragment
--------------------------------------------------------------------------------
-- These messages specify what is produced by the ${INTROBLURB} and
-- ${INTROFRAGMENT} parameters. If the protection is temporary they use the
-- intro-blurb-expiry or intro-fragment-expiry, and if not they use
-- intro-blurb-noexpiry or intro-fragment-noexpiry.
-- It is possible to use banner parameters in these messages.
['intro-blurb-expiry'] = '${PROTECTIONBLURB} until ${EXPIRY}.',
['intro-blurb-noexpiry'] = '${PROTECTIONBLURB}.',
['intro-fragment-expiry'] = '${PROTECTIONBLURB} until ${EXPIRY},',
['intro-fragment-noexpiry'] = '${PROTECTIONBLURB}',
--------------------------------------------------------------------------------
-- Tooltip blurb
--------------------------------------------------------------------------------
-- These messages specify what is produced by the ${TOOLTIPBLURB} parameter.
-- If the protection is temporary the tooltip-blurb-expiry message is used, and
-- if not the tooltip-blurb-noexpiry message is used.
-- It is possible to use banner parameters in these messages.
['tooltip-blurb-expiry'] = 'This ${PAGETYPE} is ${PROTECTIONLEVEL} until ${EXPIRY}.',
['tooltip-blurb-noexpiry'] = 'This ${PAGETYPE} is ${PROTECTIONLEVEL}.',
['tooltip-fragment-expiry'] = 'This ${PAGETYPE} is ${PROTECTIONLEVEL} until ${EXPIRY},',
['tooltip-fragment-noexpiry'] = 'This ${PAGETYPE} is ${PROTECTIONLEVEL}',
--------------------------------------------------------------------------------
-- Special explanation blurb
--------------------------------------------------------------------------------
-- An explanation blurb for pages that cannot be unprotected, e.g. for pages
-- in the MediaWiki namespace.
-- It is possible to use banner parameters in this message.
['explanation-blurb-nounprotect'] = 'See the [[Wikipedia:Protection policy|'
.. 'protection policy]] and ${PROTECTIONLOG} for more details.'
.. ' Please discuss any changes on the ${TALKPAGE}; you'
.. ' may ${EDITREQUEST} to ask an'
.. ' [[Wikipedia:Administrators|administrator]] to make an edit if it'
.. ' is [[Help:Minor edit#When to mark an edit as a minor edit'
.. '|uncontroversial]] or supported by [[Wikipedia:Consensus'
.. '|consensus]].',
--------------------------------------------------------------------------------
-- Protection log display values
--------------------------------------------------------------------------------
-- These messages determine the display values for the protection log link
-- or the pending changes log link produced by the ${PROTECTIONLOG} parameter.
-- It is possible to use banner parameters in these messages.
['protection-log-display'] = 'protection log',
['pc-log-display'] = 'pending changes log',
--------------------------------------------------------------------------------
-- Current version display values
--------------------------------------------------------------------------------
-- These messages determine the display values for the page history link
-- or the move log link produced by the ${CURRENTVERSION} parameter.
-- It is possible to use banner parameters in these messages.
['current-version-move-display'] = 'current title',
['current-version-edit-display'] = 'current version',
--------------------------------------------------------------------------------
-- Talk page
--------------------------------------------------------------------------------
-- This message determines the display value of the talk page link produced
-- with the ${TALKPAGE} parameter.
-- It is possible to use banner parameters in this message.
['talk-page-link-display'] = 'talk page',
--------------------------------------------------------------------------------
-- Edit requests
--------------------------------------------------------------------------------
-- This message determines the display value of the edit request link produced
-- with the ${EDITREQUEST} parameter.
-- It is possible to use banner parameters in this message.
['edit-request-display'] = 'submit an edit request',
--------------------------------------------------------------------------------
-- Expiry date format
--------------------------------------------------------------------------------
-- This is the format for the blurb expiry date. It should be valid input for
-- the first parameter of the #time parser function.
['expiry-date-format'] = 'F j, Y "at" H:i e',
--------------------------------------------------------------------------------
-- Tracking categories
--------------------------------------------------------------------------------
-- These messages determine which tracking categories the module outputs.
['tracking-category-incorrect'] = 'Wikipedia pages with incorrect protection templates',
['tracking-category-template'] = 'Wikipedia template-protected pages other than templates and modules',
--------------------------------------------------------------------------------
-- Images
--------------------------------------------------------------------------------
-- These are images that are not defined by their protection action and protection level.
['image-filename-indef'] = 'Full-protection-shackle.svg',
['image-filename-default'] = 'Transparent.gif',
--------------------------------------------------------------------------------
-- End messages
--------------------------------------------------------------------------------
}
--------------------------------------------------------------------------------
-- End configuration
--------------------------------------------------------------------------------
}
65de905227752d0a0dae145e9ad8dbe1d0087016
Module:Sidebar
828
68
96
95
2024-03-26T22:29:47Z
Vicht
1
1 revision imported
Scribunto
text/plain
require('strict')
local cfg = mw.loadData('Module:Sidebar/configuration')
local p = {}
local getArgs = require('Module:Arguments').getArgs
--[[
Categorizes calling templates and modules with a 'style' parameter of any sort
for tracking to convert to TemplateStyles.
TODO after a long cleanup: Catch sidebars in other namespaces than Template and Module.
TODO would probably want to remove /log and /archive as CS1 does
]]
local function categorizeTemplatesWithInlineStyles(args)
local title = mw.title.getCurrentTitle()
if title.namespace ~= 10 and title.namespace ~= 828 then return '' end
for _, pattern in ipairs (cfg.i18n.pattern.uncategorized_conversion_titles) do
if title.text:match(pattern) then return '' end
end
for key, _ in pairs(args) do
if mw.ustring.find(key, cfg.i18n.pattern.style_conversion) or key == 'width' then
return cfg.i18n.category.conversion
end
end
end
--[[
For compatibility with the original {{sidebar with collapsible lists}}
implementation, which passed some parameters through {{#if}} to trim their
whitespace. This also triggered the automatic newline behavior.
]]
-- See ([[meta:Help:Newlines and spaces#Automatic newline]])
local function trimAndAddAutomaticNewline(s)
s = mw.ustring.gsub(s, "^%s*(.-)%s*$", "%1")
if mw.ustring.find(s, '^[#*:;]') or mw.ustring.find(s, '^{|') then
return '\n' .. s
else
return s
end
end
--[[
Finds whether a sidebar has a subgroup sidebar.
]]
local function hasSubgroup(s)
if mw.ustring.find(s, cfg.i18n.pattern.subgroup) then
return true
else
return false
end
end
local function has_navbar(navbar_mode, sidebar_name)
return navbar_mode ~= cfg.i18n.navbar_none and
navbar_mode ~= cfg.i18n.navbar_off and
(
sidebar_name or
mw.getCurrentFrame():getParent():getTitle():gsub(cfg.i18n.pattern.sandbox, '') ~=
cfg.i18n.title_not_to_add_navbar
)
end
local function has_list_class(args, htmlclass)
local patterns = {
'^' .. htmlclass .. '$',
'%s' .. htmlclass .. '$',
'^' .. htmlclass .. '%s',
'%s' .. htmlclass .. '%s'
}
for arg, value in pairs(args) do
if type(arg) == 'string' and mw.ustring.find(arg, 'class') then
for _, pattern in ipairs(patterns) do
if mw.ustring.find(args[arg] or '', pattern) then
return true
end
end
end
end
return false
end
-- there are a lot of list classes in the wild, so we add their TemplateStyles
local function add_list_styles(args)
local frame = mw.getCurrentFrame()
local function add_list_templatestyles(htmlclass, templatestyles)
if has_list_class(args, htmlclass) then
return frame:extensionTag{
name = 'templatestyles', args = { src = templatestyles }
}
else
return ''
end
end
local plainlist_styles = add_list_templatestyles('plainlist', cfg.i18n.plainlist_templatestyles)
local hlist_styles = add_list_templatestyles('hlist', cfg.i18n.hlist_templatestyles)
-- a second workaround for [[phab:T303378]]
-- when that issue is fixed, we can actually use has_navbar not to emit the
-- tag here if we want
if has_navbar(args.navbar, args.name) and hlist_styles == '' then
hlist_styles = frame:extensionTag{
name = 'templatestyles', args = { src = cfg.i18n.hlist_templatestyles}
}
end
-- hlist -> plainlist is best-effort to preserve old Common.css ordering. [hlist_note]
return hlist_styles .. plainlist_styles
end
-- work around [[phab:T303378]]
-- for each arg: find all the templatestyles strip markers, insert them into a
-- table. then remove all templatestyles markers from the arg
local function move_hiding_templatestyles(args)
local gfind = string.gfind
local gsub = string.gsub
local templatestyles_markers = {}
local strip_marker_pattern = '(\127[^\127]*UNIQ%-%-templatestyles%-%x+%-QINU[^\127]*\127)'
for k, arg in pairs(args) do
for marker in gfind(arg, strip_marker_pattern) do
table.insert(templatestyles_markers, marker)
end
args[k] = gsub(arg, strip_marker_pattern, '')
end
return templatestyles_markers
end
--[[
Main sidebar function. Takes the frame, args, and an optional collapsibleClass.
The collapsibleClass is and should be used only for sidebars with collapsible
lists, as in p.collapsible.
]]
function p.sidebar(frame, args, collapsibleClass)
if not args then
args = getArgs(frame)
end
local hiding_templatestyles = table.concat(move_hiding_templatestyles(args))
local root = mw.html.create()
local child = args.child and mw.text.trim(args.child) == cfg.i18n.child_yes
root = root:tag('table')
if not child then
root
:addClass(cfg.i18n.class.sidebar)
-- force collapsibleclass to be sidebar-collapse otherwise output nothing
:addClass(collapsibleClass == cfg.i18n.class.collapse and cfg.i18n.class.collapse or nil)
:addClass('nomobile')
:addClass(args.float == cfg.i18n.float_none and cfg.i18n.class.float_none or nil)
:addClass(args.float == cfg.i18n.float_left and cfg.i18n.class.float_left or nil)
:addClass(args.wraplinks ~= cfg.i18n.wrap_true and cfg.i18n.class.wraplinks or nil)
:addClass(args.bodyclass or args.class)
:css('width', args.width or nil)
:cssText(args.bodystyle or args.style)
if args.outertitle then
root
:tag('caption')
:addClass(cfg.i18n.class.outer_title)
:addClass(args.outertitleclass)
:cssText(args.outertitlestyle)
:wikitext(args.outertitle)
end
if args.topimage then
local imageCell = root:tag('tr'):tag('td')
imageCell
:addClass(cfg.i18n.class.top_image)
:addClass(args.topimageclass)
:cssText(args.topimagestyle)
:wikitext(args.topimage)
if args.topcaption then
imageCell
:tag('div')
:addClass(cfg.i18n.class.top_caption)
:cssText(args.topcaptionstyle)
:wikitext(args.topcaption)
end
end
if args.pretitle then
root
:tag('tr')
:tag('td')
:addClass(args.topimage and cfg.i18n.class.pretitle_with_top_image
or cfg.i18n.class.pretitle)
:addClass(args.pretitleclass)
:cssText(args.basestyle)
:cssText(args.pretitlestyle)
:wikitext(args.pretitle)
end
else
root
:addClass(cfg.i18n.class.subgroup)
:addClass(args.bodyclass or args.class)
:cssText(args.bodystyle or args.style)
end
if args.title then
if child then
root
:wikitext(args.title)
else
root
:tag('tr')
:tag('th')
:addClass(args.pretitle and cfg.i18n.class.title_with_pretitle
or cfg.i18n.class.title)
:addClass(args.titleclass)
:cssText(args.basestyle)
:cssText(args.titlestyle)
:wikitext(args.title)
end
end
if args.image then
local imageCell = root:tag('tr'):tag('td')
imageCell
:addClass(cfg.i18n.class.image)
:addClass(args.imageclass)
:cssText(args.imagestyle)
:wikitext(args.image)
if args.caption then
imageCell
:tag('div')
:addClass(cfg.i18n.class.caption)
:cssText(args.captionstyle)
:wikitext(args.caption)
end
end
if args.above then
root
:tag('tr')
:tag('td')
:addClass(cfg.i18n.class.above)
:addClass(args.aboveclass)
:cssText(args.abovestyle)
:newline() -- newline required for bullet-points to work
:wikitext(args.above)
end
local rowNums = {}
for k, v in pairs(args) do
k = '' .. k
local num = k:match('^heading(%d+)$') or k:match('^content(%d+)$')
if num then table.insert(rowNums, tonumber(num)) end
end
table.sort(rowNums)
-- remove duplicates from the list (e.g. 3 will be duplicated if both heading3
-- and content3 are specified)
for i = #rowNums, 1, -1 do
if rowNums[i] == rowNums[i - 1] then
table.remove(rowNums, i)
end
end
for i, num in ipairs(rowNums) do
local heading = args['heading' .. num]
if heading then
root
:tag('tr')
:tag('th')
:addClass(cfg.i18n.class.heading)
:addClass(args.headingclass)
:addClass(args['heading' .. num .. 'class'])
:cssText(args.basestyle)
:cssText(args.headingstyle)
:cssText(args['heading' .. num .. 'style'])
:newline()
:wikitext(heading)
end
local content = args['content' .. num]
if content then
root
:tag('tr')
:tag('td')
:addClass(hasSubgroup(content) and cfg.i18n.class.content_with_subgroup
or cfg.i18n.class.content)
:addClass(args.contentclass)
:addClass(args['content' .. num .. 'class'])
:cssText(args.contentstyle)
:cssText(args['content' .. num .. 'style'])
:newline()
:wikitext(content)
:done()
-- Without a linebreak after the </td>, a nested list like
-- "* {{hlist| ...}}" doesn't parse correctly.
:newline()
end
end
if args.below then
root
:tag('tr')
:tag('td')
:addClass(cfg.i18n.class.below)
:addClass(args.belowclass)
:cssText(args.belowstyle)
:newline()
:wikitext(args.below)
end
if not child and has_navbar(args.navbar, args.name) then
root
:tag('tr')
:tag('td')
:addClass(cfg.i18n.class.navbar)
:cssText(args.navbarstyle)
:wikitext(require('Module:Navbar')._navbar{
args.name,
mini = 1,
fontstyle = args.navbarfontstyle
})
end
local base_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = cfg.i18n.templatestyles }
}
local templatestyles = ''
if args['templatestyles'] and args['templatestyles'] ~= '' then
templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['templatestyles'] }
}
end
local child_templatestyles = ''
if args['child templatestyles'] and args['child templatestyles'] ~= '' then
child_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['child templatestyles'] }
}
end
local grandchild_templatestyles = ''
if args['grandchild templatestyles'] and args['grandchild templatestyles'] ~= '' then
grandchild_templatestyles = frame:extensionTag{
name = 'templatestyles', args = { src = args['grandchild templatestyles'] }
}
end
return table.concat({
add_list_styles(args), -- see [hlist_note] above about ordering
base_templatestyles,
templatestyles,
child_templatestyles,
grandchild_templatestyles,
hiding_templatestyles,
tostring(root),
(child and cfg.i18n.category.child or ''),
categorizeTemplatesWithInlineStyles(args)
})
end
local function list_title(args, is_centered_list_titles, num)
local title_text = trimAndAddAutomaticNewline(args['list' .. num .. 'title']
or cfg.i18n.default_list_title)
local title
if is_centered_list_titles then
-- collapsible can be finicky, so provide some CSS/HTML to support
title = mw.html.create('div')
:addClass(cfg.i18n.class.list_title_centered)
:wikitext(title_text)
else
title = mw.html.create()
:wikitext(title_text)
end
local title_container = mw.html.create('div')
:addClass(cfg.i18n.class.list_title)
-- don't /need/ a listnumtitleclass because you can do
-- .templateclass .listnumclass .sidebar-list-title
:addClass(args.listtitleclass)
:cssText(args.basestyle)
:cssText(args.listtitlestyle)
:cssText(args['list' .. num .. 'titlestyle'])
:node(title)
:done()
return title_container
end
--[[
Main entry point for sidebar with collapsible lists.
Does the work of creating the collapsible lists themselves and including them
into the args.
]]
function p.collapsible(frame)
local args = getArgs(frame)
if not args.name and
frame:getParent():getTitle():gsub(cfg.i18n.pattern.collapse_sandbox, '') ==
cfg.i18n.collapse_title_not_to_add_navbar then
args.navbar = cfg.i18n.navbar_none
end
local contentArgs = {}
local is_centered_list_titles = false
if args['centered list titles'] and args['centered list titles'] ~= '' then
is_centered_list_titles = true
end
for k, v in pairs(args) do
local num = string.match(k, '^list(%d+)$')
if num then
local expand = args.expanded and
(args.expanded == 'all' or args.expanded == args['list' .. num .. 'name'])
local row = mw.html.create('div')
row
:addClass(cfg.i18n.class.list)
:addClass('mw-collapsible')
:addClass((not expand) and 'mw-collapsed' or nil)
:addClass(args['list' .. num .. 'class'])
:cssText(args.listframestyle)
:cssText(args['list' .. num .. 'framestyle'])
:node(list_title(args, is_centered_list_titles, num))
:tag('div')
:addClass(cfg.i18n.class.list_content)
:addClass('mw-collapsible-content')
-- don't /need/ a listnumstyleclass because you can do
-- .templatename .listnumclass .sidebar-list
:addClass(args.listclass)
:cssText(args.liststyle)
:cssText(args['list' .. num .. 'style'])
:wikitext(trimAndAddAutomaticNewline(args['list' .. num]))
contentArgs['content' .. num] = tostring(row)
end
end
for k, v in pairs(contentArgs) do
args[k] = v
end
return p.sidebar(frame, args, cfg.i18n.class.collapse)
end
return p
71fe765846593e025ca2f94371315e9dbb5bb4d2
Module:Sidebar/configuration
828
69
98
97
2024-03-26T22:29:47Z
Vicht
1
1 revision imported
Scribunto
text/plain
return {
i18n = {
child_yes = 'yes',
float_none = 'none',
float_left = 'left',
wrap_true = 'true',
navbar_none = 'none',
navbar_off = 'off',
default_list_title = 'List',
title_not_to_add_navbar = 'Template:Sidebar',
collapse_title_not_to_add_navbar = 'Template:Sidebar with collapsible lists',
templatestyles = 'Module:Sidebar/styles.css',
hlist_templatestyles = 'Hlist/styles.css',
plainlist_templatestyles = 'Plainlist/styles.css',
category = {
child = '[[Category:Pages using sidebar with the child parameter]]',
conversion = '[[Category:Sidebars with styles needing conversion]]'
},
pattern = {
collapse_sandbox = '/sandbox$',
sandbox = '/sandbox$',
subgroup = 'sidebar%-subgroup',
style_conversion = 'style$',
uncategorized_conversion_titles = {
'/[Ss]andbox',
'/[Tt]estcases',
'/[Dd]oc$'
}
},
class = {
sidebar = 'sidebar',
subgroup = 'sidebar-subgroup',
collapse = 'sidebar-collapse',
float_none = 'sidebar-none',
float_left = 'sidebar-left',
wraplinks = 'nowraplinks',
outer_title = 'sidebar-outer-title',
top_image = 'sidebar-top-image',
top_caption = 'sidebar-top-caption',
pretitle = 'sidebar-pretitle',
pretitle_with_top_image = 'sidebar-pretitle-with-top-image',
title = 'sidebar-title',
title_with_pretitle = 'sidebar-title-with-pretitle',
image = 'sidebar-image',
caption = 'sidebar-caption',
above = 'sidebar-above',
heading = 'sidebar-heading',
content = 'sidebar-content',
content_with_subgroup = 'sidebar-content-with-subgroup',
below = 'sidebar-below',
navbar = 'sidebar-navbar',
list = 'sidebar-list',
list_title = 'sidebar-list-title',
list_title_centered = 'sidebar-list-title-c',
list_content = 'sidebar-list-content'
}
}
}
dc2a980ac2162a898f7c21e6d6ba7e994dfeb315
Module:Sidebar/styles.css
828
70
100
99
2024-03-26T22:29:47Z
Vicht
1
1 revision imported
sanitized-css
text/css
/* {{pp-template}} */
/* TODO: Invert width design to be "mobile first" */
.sidebar {
/* TODO: Ask if we should have max-width 22em instead */
width: 22em;
/* @noflip */
float: right;
/* @noflip */
clear: right;
/* @noflip */
margin: 0.5em 0 1em 1em;
background: #f8f9fa;
border: 1px solid #aaa;
padding: 0.2em;
text-align: center;
line-height: 1.4em;
font-size: 88%;
border-collapse: collapse;
/* Timeless has display: none on .nomobile at mobile resolutions, so we
* unhide it with display: table and let precedence and proximity win.
*/
display: table;
}
/* Unfortunately, so does Minerva desktop, except Minerva drops an
* !important on the declaration. So we have to be mean for Minerva users.
* Mobile removes the element entirely with `wgMFRemovableClasses` in
* https://github.com/wikimedia/operations-mediawiki-config/blob/master/
wmf-config/InitialiseSettings.php#L16992
* which is why displaying it categorically with display: table works.
* We don't really want to expose the generic user in the wild on mobile to have
* to deal with sidebars. (Maybe the ones with collapsible lists, so that
* might be an improvement. That is blocked on [[:phab:T111565]].)
*/
body.skin-minerva .sidebar {
display: table !important;
/* also, minerva is way too aggressive about other stylings on tables.
* TODO remove when this template gets moved to a div. plans on talk page.
* We always float right on Minerva because that's a lot of extra CSS
* otherwise. */
float: right !important;
margin: 0.5em 0 1em 1em !important;
}
.sidebar-subgroup {
width: 100%;
margin: 0;
border-spacing: 0;
}
.sidebar-left {
/* @noflip */
float: left;
/* @noflip */
clear: left;
/* @noflip */
margin: 0.5em 1em 1em 0;
}
.sidebar-none {
float: none;
clear: both;
/* @noflip */
margin: 0.5em 1em 1em 0;
}
.sidebar-outer-title {
padding: 0 0.4em 0.2em;
font-size: 125%;
line-height: 1.2em;
font-weight: bold;
}
.sidebar-top-image {
padding: 0.4em;
}
.sidebar-top-caption,
.sidebar-pretitle-with-top-image,
.sidebar-caption {
padding: 0.2em 0.4em 0;
line-height: 1.2em;
}
.sidebar-pretitle {
padding: 0.4em 0.4em 0;
line-height: 1.2em;
}
.sidebar-title,
.sidebar-title-with-pretitle {
padding: 0.2em 0.8em;
font-size: 145%;
line-height: 1.2em;
}
.sidebar-title-with-pretitle {
padding: 0.1em 0.4em;
}
.sidebar-image {
padding: 0.2em 0.4em 0.4em;
}
.sidebar-heading {
padding: 0.1em 0.4em;
}
.sidebar-content {
padding: 0 0.5em 0.4em;
}
.sidebar-content-with-subgroup {
padding: 0.1em 0.4em 0.2em;
}
.sidebar-above,
.sidebar-below {
padding: 0.3em 0.8em;
font-weight: bold;
}
.sidebar-collapse .sidebar-above,
.sidebar-collapse .sidebar-below {
border-top: 1px solid #aaa;
border-bottom: 1px solid #aaa;
}
.sidebar-navbar {
text-align: right;
font-size: 115%;
padding: 0 0.4em 0.4em;
}
.sidebar-list-title {
padding: 0 0.4em;
text-align: left;
font-weight: bold;
line-height: 1.6em;
font-size: 105%;
}
/* centered text with mw-collapsible headers is finicky */
.sidebar-list-title-c {
padding: 0 0.4em;
text-align: center;
margin: 0 3.3em;
}
@media (max-width: 720px) {
/* users have wide latitude to set arbitrary width and margin :(
"Super-specific" selector to prevent overriding this appearance by
lower level sidebars too */
body.mediawiki .sidebar {
width: 100% !important;
clear: both;
float: none !important; /* Remove when we div based; Minerva is dumb */
margin-left: 0 !important;
margin-right: 0 !important;
}
/* TODO: We might consider making all links wrap at small resolutions and then
* only introduce nowrap at higher resolutions. Do when we invert the media
* query.
*/
}
7d621b35a37807a103b59075851fe36201204ceb
Template:Ombox
10
71
102
101
2024-03-26T22:29:47Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
{{#invoke:Message box|ombox}}<noinclude>
{{documentation}}
<!-- Categories go on the /doc subpage, and interwikis go on Wikidata. -->
</noinclude>
0e54065432d540737b9e56c4e3a8e7f74d4534ea
Module:TNT
828
72
104
103
2024-03-26T22:29:47Z
Vicht
1
1 revision imported
Scribunto
text/plain
--
-- INTRO: (!!! DO NOT RENAME THIS PAGE !!!)
-- This module allows any template or module to be copy/pasted between
-- wikis without any translation changes. All translation text is stored
-- in the global Data:*.tab pages on Commons, and used everywhere.
--
-- SEE: https://www.mediawiki.org/wiki/Multilingual_Templates_and_Modules
--
-- ATTENTION:
-- Please do NOT rename this module - it has to be identical on all wikis.
-- This code is maintained at https://www.mediawiki.org/wiki/Module:TNT
-- Please do not modify it anywhere else, as it may get copied and override your changes.
-- Suggestions can be made at https://www.mediawiki.org/wiki/Module_talk:TNT
--
-- DESCRIPTION:
-- The "msg" function uses a Commons dataset to translate a message
-- with a given key (e.g. source-table), plus optional arguments
-- to the wiki markup in the current content language.
-- Use lang=xx to set language. Example:
--
-- {{#invoke:TNT | msg
-- | I18n/Template:Graphs.tab <!-- https://commons.wikimedia.org/wiki/Data:I18n/Template:Graphs.tab -->
-- | source-table <!-- uses a translation message with id = "source-table" -->
-- | param1 }} <!-- optional parameter -->
--
--
-- The "doc" function will generate the <templatedata> parameter documentation for templates.
-- This way all template parameters can be stored and localized in a single Commons dataset.
-- NOTE: "doc" assumes that all documentation is located in Data:Templatedata/* on Commons.
--
-- {{#invoke:TNT | doc | Graph:Lines }}
-- uses https://commons.wikimedia.org/wiki/Data:Templatedata/Graph:Lines.tab
-- if the current page is Template:Graph:Lines/doc
--
local p = {}
local i18nDataset = 'I18n/Module:TNT.tab'
-- Forward declaration of the local functions
local sanitizeDataset, loadData, link, formatMessage
function p.msg(frame)
local dataset, id
local params = {}
local lang = nil
for k, v in pairs(frame.args) do
if k == 1 then
dataset = mw.text.trim(v)
elseif k == 2 then
id = mw.text.trim(v)
elseif type(k) == 'number' then
table.insert(params, mw.text.trim(v))
elseif k == 'lang' and v ~= '_' then
lang = mw.text.trim(v)
end
end
return formatMessage(dataset, id, params, lang)
end
-- Identical to p.msg() above, but used from other lua modules
-- Parameters: name of dataset, message key, optional arguments
-- Example with 2 params: format('I18n/Module:TNT', 'error_bad_msgkey', 'my-key', 'my-dataset')
function p.format(dataset, key, ...)
local checkType = require('libraryUtil').checkType
checkType('format', 1, dataset, 'string')
checkType('format', 2, key, 'string')
return formatMessage(dataset, key, {...})
end
-- Identical to p.msg() above, but used from other lua modules with the language param
-- Parameters: language code, name of dataset, message key, optional arguments
-- Example with 2 params: formatInLanguage('es', I18n/Module:TNT', 'error_bad_msgkey', 'my-key', 'my-dataset')
function p.formatInLanguage(lang, dataset, key, ...)
local checkType = require('libraryUtil').checkType
checkType('formatInLanguage', 1, lang, 'string')
checkType('formatInLanguage', 2, dataset, 'string')
checkType('formatInLanguage', 3, key, 'string')
return formatMessage(dataset, key, {...}, lang)
end
-- Obsolete function that adds a 'c:' prefix to the first param.
-- "Sandbox/Sample.tab" -> 'c:Data:Sandbox/Sample.tab'
function p.link(frame)
return link(frame.args[1])
end
function p.doc(frame)
local dataset = 'Templatedata/' .. sanitizeDataset(frame.args[1])
return frame:extensionTag('templatedata', p.getTemplateData(dataset)) ..
formatMessage(i18nDataset, 'edit_doc', {link(dataset)})
end
function p.getTemplateData(dataset)
-- TODO: add '_' parameter once lua starts reindexing properly for "all" languages
local data = loadData(dataset)
local names = {}
for _, field in pairs(data.schema.fields) do
table.insert(names, field.name)
end
local params = {}
local paramOrder = {}
for _, row in pairs(data.data) do
local newVal = {}
local name = nil
for pos, val in pairs(row) do
local columnName = names[pos]
if columnName == 'name' then
name = val
else
newVal[columnName] = val
end
end
if name then
params[name] = newVal
table.insert(paramOrder, name)
end
end
-- Work around json encoding treating {"1":{...}} as an [{...}]
params['zzz123']=''
local json = mw.text.jsonEncode({
params=params,
paramOrder=paramOrder,
description=data.description
})
json = string.gsub(json,'"zzz123":"",?', "")
return json
end
-- Local functions
sanitizeDataset = function(dataset)
if not dataset then
return nil
end
dataset = mw.text.trim(dataset)
if dataset == '' then
return nil
elseif string.sub(dataset,-4) ~= '.tab' then
return dataset .. '.tab'
else
return dataset
end
end
loadData = function(dataset, lang)
dataset = sanitizeDataset(dataset)
if not dataset then
error(formatMessage(i18nDataset, 'error_no_dataset', {}))
end
-- Give helpful error to thirdparties who try and copy this module.
if not mw.ext or not mw.ext.data or not mw.ext.data.get then
error('Missing JsonConfig extension; Cannot load https://commons.wikimedia.org/wiki/Data:' .. dataset)
end
local data = mw.ext.data.get(dataset, lang)
if data == false then
if dataset == i18nDataset then
-- Prevent cyclical calls
error('Missing Commons dataset ' .. i18nDataset)
else
error(formatMessage(i18nDataset, 'error_bad_dataset', {link(dataset)}))
end
end
return data
end
-- Given a dataset name, convert it to a title with the 'commons:data:' prefix
link = function(dataset)
return 'c:Data:' .. mw.text.trim(dataset or '')
end
formatMessage = function(dataset, key, params, lang)
for _, row in pairs(loadData(dataset, lang).data) do
local id, msg = unpack(row)
if id == key then
local result = mw.message.newRawMessage(msg, unpack(params or {}))
return result:plain()
end
end
if dataset == i18nDataset then
-- Prevent cyclical calls
error('Invalid message key "' .. key .. '"')
else
error(formatMessage(i18nDataset, 'error_bad_msgkey', {key, link(dataset)}))
end
end
return p
9d0d10e54abd232c806dcabccaf03e52858634a1
Module:Documentation
828
73
106
105
2024-03-26T22:29:47Z
Vicht
1
1 revision imported
Scribunto
text/plain
-- This module implements {{documentation}}.
-- Get required modules.
local getArgs = require('Module:Arguments').getArgs
-- Get the config table.
local cfg = mw.loadData('Module:Documentation/config')
local p = {}
-- Often-used functions.
local ugsub = mw.ustring.gsub
local format = mw.ustring.format
----------------------------------------------------------------------------
-- Helper functions
--
-- These are defined as local functions, but are made available in the p
-- table for testing purposes.
----------------------------------------------------------------------------
local function message(cfgKey, valArray, expectType)
--[[
-- Gets a message from the cfg table and formats it if appropriate.
-- The function raises an error if the value from the cfg table is not
-- of the type expectType. The default type for expectType is 'string'.
-- If the table valArray is present, strings such as $1, $2 etc. in the
-- message are substituted with values from the table keys [1], [2] etc.
-- For example, if the message "foo-message" had the value 'Foo $2 bar $1.',
-- message('foo-message', {'baz', 'qux'}) would return "Foo qux bar baz."
--]]
local msg = cfg[cfgKey]
expectType = expectType or 'string'
if type(msg) ~= expectType then
error('message: type error in message cfg.' .. cfgKey .. ' (' .. expectType .. ' expected, got ' .. type(msg) .. ')', 2)
end
if not valArray then
return msg
end
local function getMessageVal(match)
match = tonumber(match)
return valArray[match] or error('message: no value found for key $' .. match .. ' in message cfg.' .. cfgKey, 4)
end
return ugsub(msg, '$([1-9][0-9]*)', getMessageVal)
end
p.message = message
local function makeWikilink(page, display)
if display then
return format('[[%s|%s]]', page, display)
else
return format('[[%s]]', page)
end
end
p.makeWikilink = makeWikilink
local function makeCategoryLink(cat, sort)
local catns = mw.site.namespaces[14].name
return makeWikilink(catns .. ':' .. cat, sort)
end
p.makeCategoryLink = makeCategoryLink
local function makeUrlLink(url, display)
return format('[%s %s]', url, display)
end
p.makeUrlLink = makeUrlLink
local function makeToolbar(...)
local ret = {}
local lim = select('#', ...)
if lim < 1 then
return nil
end
for i = 1, lim do
ret[#ret + 1] = select(i, ...)
end
-- 'documentation-toolbar'
return format(
'<span class="%s">(%s)</span>',
message('toolbar-class'),
table.concat(ret, ' | ')
)
end
p.makeToolbar = makeToolbar
----------------------------------------------------------------------------
-- Argument processing
----------------------------------------------------------------------------
local function makeInvokeFunc(funcName)
return function (frame)
local args = getArgs(frame, {
valueFunc = function (key, value)
if type(value) == 'string' then
value = value:match('^%s*(.-)%s*$') -- Remove whitespace.
if key == 'heading' or value ~= '' then
return value
else
return nil
end
else
return value
end
end
})
return p[funcName](args)
end
end
----------------------------------------------------------------------------
-- Entry points
----------------------------------------------------------------------------
function p.nonexistent(frame)
if mw.title.getCurrentTitle().subpageText == 'testcases' then
return frame:expandTemplate{title = 'module test cases notice'}
else
return p.main(frame)
end
end
p.main = makeInvokeFunc('_main')
function p._main(args)
--[[
-- This function defines logic flow for the module.
-- @args - table of arguments passed by the user
--]]
local env = p.getEnvironment(args)
local root = mw.html.create()
root
:wikitext(p._getModuleWikitext(args, env))
:wikitext(p.protectionTemplate(env))
:wikitext(p.sandboxNotice(args, env))
:tag('div')
-- 'documentation-container'
:addClass(message('container'))
:attr('role', 'complementary')
:attr('aria-labelledby', args.heading ~= '' and 'documentation-heading' or nil)
:attr('aria-label', args.heading == '' and 'Documentation' or nil)
:newline()
:tag('div')
-- 'documentation'
:addClass(message('main-div-classes'))
:newline()
:wikitext(p._startBox(args, env))
:wikitext(p._content(args, env))
:tag('div')
-- 'documentation-clear'
:addClass(message('clear'))
:done()
:newline()
:done()
:wikitext(p._endBox(args, env))
:done()
:wikitext(p.addTrackingCategories(env))
-- 'Module:Documentation/styles.css'
return mw.getCurrentFrame():extensionTag (
'templatestyles', '', {src=cfg['templatestyles']
}) .. tostring(root)
end
----------------------------------------------------------------------------
-- Environment settings
----------------------------------------------------------------------------
function p.getEnvironment(args)
--[[
-- Returns a table with information about the environment, including title
-- objects and other namespace- or path-related data.
-- @args - table of arguments passed by the user
--
-- Title objects include:
-- env.title - the page we are making documentation for (usually the current title)
-- env.templateTitle - the template (or module, file, etc.)
-- env.docTitle - the /doc subpage.
-- env.sandboxTitle - the /sandbox subpage.
-- env.testcasesTitle - the /testcases subpage.
--
-- Data includes:
-- env.protectionLevels - the protection levels table of the title object.
-- env.subjectSpace - the number of the title's subject namespace.
-- env.docSpace - the number of the namespace the title puts its documentation in.
-- env.docpageBase - the text of the base page of the /doc, /sandbox and /testcases pages, with namespace.
-- env.compareUrl - URL of the Special:ComparePages page comparing the sandbox with the template.
--
-- All table lookups are passed through pcall so that errors are caught. If an error occurs, the value
-- returned will be nil.
--]]
local env, envFuncs = {}, {}
-- Set up the metatable. If triggered we call the corresponding function in the envFuncs table. The value
-- returned by that function is memoized in the env table so that we don't call any of the functions
-- more than once. (Nils won't be memoized.)
setmetatable(env, {
__index = function (t, key)
local envFunc = envFuncs[key]
if envFunc then
local success, val = pcall(envFunc)
if success then
env[key] = val -- Memoise the value.
return val
end
end
return nil
end
})
function envFuncs.title()
-- The title object for the current page, or a test page passed with args.page.
local title
local titleArg = args.page
if titleArg then
title = mw.title.new(titleArg)
else
title = mw.title.getCurrentTitle()
end
return title
end
function envFuncs.templateTitle()
--[[
-- The template (or module, etc.) title object.
-- Messages:
-- 'sandbox-subpage' --> 'sandbox'
-- 'testcases-subpage' --> 'testcases'
--]]
local subjectSpace = env.subjectSpace
local title = env.title
local subpage = title.subpageText
if subpage == message('sandbox-subpage') or subpage == message('testcases-subpage') then
return mw.title.makeTitle(subjectSpace, title.baseText)
else
return mw.title.makeTitle(subjectSpace, title.text)
end
end
function envFuncs.docTitle()
--[[
-- Title object of the /doc subpage.
-- Messages:
-- 'doc-subpage' --> 'doc'
--]]
local title = env.title
local docname = args[1] -- User-specified doc page.
local docpage
if docname then
docpage = docname
else
docpage = env.docpageBase .. '/' .. message('doc-subpage')
end
return mw.title.new(docpage)
end
function envFuncs.sandboxTitle()
--[[
-- Title object for the /sandbox subpage.
-- Messages:
-- 'sandbox-subpage' --> 'sandbox'
--]]
return mw.title.new(env.docpageBase .. '/' .. message('sandbox-subpage'))
end
function envFuncs.testcasesTitle()
--[[
-- Title object for the /testcases subpage.
-- Messages:
-- 'testcases-subpage' --> 'testcases'
--]]
return mw.title.new(env.docpageBase .. '/' .. message('testcases-subpage'))
end
function envFuncs.protectionLevels()
-- The protection levels table of the title object.
return env.title.protectionLevels
end
function envFuncs.subjectSpace()
-- The subject namespace number.
return mw.site.namespaces[env.title.namespace].subject.id
end
function envFuncs.docSpace()
-- The documentation namespace number. For most namespaces this is the
-- same as the subject namespace. However, pages in the Article, File,
-- MediaWiki or Category namespaces must have their /doc, /sandbox and
-- /testcases pages in talk space.
local subjectSpace = env.subjectSpace
if subjectSpace == 0 or subjectSpace == 6 or subjectSpace == 8 or subjectSpace == 14 then
return subjectSpace + 1
else
return subjectSpace
end
end
function envFuncs.docpageBase()
-- The base page of the /doc, /sandbox, and /testcases subpages.
-- For some namespaces this is the talk page, rather than the template page.
local templateTitle = env.templateTitle
local docSpace = env.docSpace
local docSpaceText = mw.site.namespaces[docSpace].name
-- Assemble the link. docSpace is never the main namespace, so we can hardcode the colon.
return docSpaceText .. ':' .. templateTitle.text
end
function envFuncs.compareUrl()
-- Diff link between the sandbox and the main template using [[Special:ComparePages]].
local templateTitle = env.templateTitle
local sandboxTitle = env.sandboxTitle
if templateTitle.exists and sandboxTitle.exists then
local compareUrl = mw.uri.canonicalUrl(
'Special:ComparePages',
{ page1 = templateTitle.prefixedText, page2 = sandboxTitle.prefixedText}
)
return tostring(compareUrl)
else
return nil
end
end
return env
end
----------------------------------------------------------------------------
-- Auxiliary templates
----------------------------------------------------------------------------
p.getModuleWikitext = makeInvokeFunc('_getModuleWikitext')
function p._getModuleWikitext(args, env)
local currentTitle = mw.title.getCurrentTitle()
if currentTitle.contentModel ~= 'Scribunto' then return end
pcall(require, currentTitle.prefixedText) -- if it fails, we don't care
local moduleWikitext = package.loaded["Module:Module wikitext"]
if moduleWikitext then
return moduleWikitext.main()
end
end
function p.sandboxNotice(args, env)
--[=[
-- Generates a sandbox notice for display above sandbox pages.
-- @args - a table of arguments passed by the user
-- @env - environment table containing title objects, etc., generated with p.getEnvironment
--
-- Messages:
-- 'sandbox-notice-image' --> '[[File:Sandbox.svg|50px|alt=|link=]]'
-- 'sandbox-notice-blurb' --> 'This is the $1 for $2.'
-- 'sandbox-notice-diff-blurb' --> 'This is the $1 for $2 ($3).'
-- 'sandbox-notice-pagetype-template' --> '[[Wikipedia:Template test cases|template sandbox]] page'
-- 'sandbox-notice-pagetype-module' --> '[[Wikipedia:Template test cases|module sandbox]] page'
-- 'sandbox-notice-pagetype-other' --> 'sandbox page'
-- 'sandbox-notice-compare-link-display' --> 'diff'
-- 'sandbox-notice-testcases-blurb' --> 'See also the companion subpage for $1.'
-- 'sandbox-notice-testcases-link-display' --> 'test cases'
-- 'sandbox-category' --> 'Template sandboxes'
-- 'module-sandbox-category' --> 'Module sandboxes'
-- 'other-sandbox-category' --> 'Sandboxes outside of template or module namespace'
--]=]
local title = env.title
local sandboxTitle = env.sandboxTitle
local templateTitle = env.templateTitle
local subjectSpace = env.subjectSpace
if not (subjectSpace and title and sandboxTitle and templateTitle
and mw.title.equals(title, sandboxTitle)) then
return nil
end
-- Build the table of arguments to pass to {{ombox}}. We need just two fields, "image" and "text".
local omargs = {}
omargs.image = message('sandbox-notice-image')
-- Get the text. We start with the opening blurb, which is something like
-- "This is the template sandbox for [[Template:Foo]] (diff)."
local text = ''
local pagetype, sandboxCat
if subjectSpace == 10 then
pagetype = message('sandbox-notice-pagetype-template')
sandboxCat = message('sandbox-category')
elseif subjectSpace == 828 then
pagetype = message('sandbox-notice-pagetype-module')
sandboxCat = message('module-sandbox-category')
else
pagetype = message('sandbox-notice-pagetype-other')
sandboxCat = message('other-sandbox-category')
end
local templateLink = makeWikilink(templateTitle.prefixedText)
local compareUrl = env.compareUrl
if compareUrl then
local compareDisplay = message('sandbox-notice-compare-link-display')
local compareLink = makeUrlLink(compareUrl, compareDisplay)
text = text .. message('sandbox-notice-diff-blurb', {pagetype, templateLink, compareLink})
else
text = text .. message('sandbox-notice-blurb', {pagetype, templateLink})
end
-- Get the test cases page blurb if the page exists. This is something like
-- "See also the companion subpage for [[Template:Foo/testcases|test cases]]."
local testcasesTitle = env.testcasesTitle
if testcasesTitle and testcasesTitle.exists then
if testcasesTitle.contentModel == "Scribunto" then
local testcasesLinkDisplay = message('sandbox-notice-testcases-link-display')
local testcasesRunLinkDisplay = message('sandbox-notice-testcases-run-link-display')
local testcasesLink = makeWikilink(testcasesTitle.prefixedText, testcasesLinkDisplay)
local testcasesRunLink = makeWikilink(testcasesTitle.talkPageTitle.prefixedText, testcasesRunLinkDisplay)
text = text .. '<br />' .. message('sandbox-notice-testcases-run-blurb', {testcasesLink, testcasesRunLink})
else
local testcasesLinkDisplay = message('sandbox-notice-testcases-link-display')
local testcasesLink = makeWikilink(testcasesTitle.prefixedText, testcasesLinkDisplay)
text = text .. '<br />' .. message('sandbox-notice-testcases-blurb', {testcasesLink})
end
end
-- Add the sandbox to the sandbox category.
omargs.text = text .. makeCategoryLink(sandboxCat)
-- 'documentation-clear'
return '<div class="' .. message('clear') .. '"></div>'
.. require('Module:Message box').main('ombox', omargs)
end
function p.protectionTemplate(env)
-- Generates the padlock icon in the top right.
-- @env - environment table containing title objects, etc., generated with p.getEnvironment
-- Messages:
-- 'protection-template' --> 'pp-template'
-- 'protection-template-args' --> {docusage = 'yes'}
local protectionLevels = env.protectionLevels
if not protectionLevels then
return nil
end
local editProt = protectionLevels.edit and protectionLevels.edit[1]
local moveProt = protectionLevels.move and protectionLevels.move[1]
if editProt then
-- The page is edit-protected.
return require('Module:Protection banner')._main{
message('protection-reason-edit'), small = true
}
elseif moveProt and moveProt ~= 'autoconfirmed' then
-- The page is move-protected but not edit-protected. Exclude move
-- protection with the level "autoconfirmed", as this is equivalent to
-- no move protection at all.
return require('Module:Protection banner')._main{
action = 'move', small = true
}
else
return nil
end
end
----------------------------------------------------------------------------
-- Start box
----------------------------------------------------------------------------
p.startBox = makeInvokeFunc('_startBox')
function p._startBox(args, env)
--[[
-- This function generates the start box.
-- @args - a table of arguments passed by the user
-- @env - environment table containing title objects, etc., generated with p.getEnvironment
--
-- The actual work is done by p.makeStartBoxLinksData and p.renderStartBoxLinks which make
-- the [view] [edit] [history] [purge] links, and by p.makeStartBoxData and p.renderStartBox
-- which generate the box HTML.
--]]
env = env or p.getEnvironment(args)
local links
local content = args.content
if not content or args[1] then
-- No need to include the links if the documentation is on the template page itself.
local linksData = p.makeStartBoxLinksData(args, env)
if linksData then
links = p.renderStartBoxLinks(linksData)
end
end
-- Generate the start box html.
local data = p.makeStartBoxData(args, env, links)
if data then
return p.renderStartBox(data)
else
-- User specified no heading.
return nil
end
end
function p.makeStartBoxLinksData(args, env)
--[[
-- Does initial processing of data to make the [view] [edit] [history] [purge] links.
-- @args - a table of arguments passed by the user
-- @env - environment table containing title objects, etc., generated with p.getEnvironment
--
-- Messages:
-- 'view-link-display' --> 'view'
-- 'edit-link-display' --> 'edit'
-- 'history-link-display' --> 'history'
-- 'purge-link-display' --> 'purge'
-- 'module-preload' --> 'Template:Documentation/preload-module-doc'
-- 'docpage-preload' --> 'Template:Documentation/preload'
-- 'create-link-display' --> 'create'
--]]
local subjectSpace = env.subjectSpace
local title = env.title
local docTitle = env.docTitle
if not title or not docTitle then
return nil
end
if docTitle.isRedirect then
docTitle = docTitle.redirectTarget
end
-- Create link if /doc doesn't exist.
local preload = args.preload
if not preload then
if subjectSpace == 828 then -- Module namespace
preload = message('module-preload')
else
preload = message('docpage-preload')
end
end
return {
title = title,
docTitle = docTitle,
-- View, display, edit, and purge links if /doc exists.
viewLinkDisplay = message('view-link-display'),
editLinkDisplay = message('edit-link-display'),
historyLinkDisplay = message('history-link-display'),
purgeLinkDisplay = message('purge-link-display'),
preload = preload,
createLinkDisplay = message('create-link-display')
}
end
function p.renderStartBoxLinks(data)
--[[
-- Generates the [view][edit][history][purge] or [create][purge] links from the data table.
-- @data - a table of data generated by p.makeStartBoxLinksData
--]]
local docTitle = data.docTitle
-- yes, we do intend to purge the template page on which the documentation appears
local purgeLink = makeWikilink("Special:Purge/" .. data.title.prefixedText, data.purgeLinkDisplay)
if docTitle.exists then
local viewLink = makeWikilink(docTitle.prefixedText, data.viewLinkDisplay)
local editLink = makeWikilink("Special:EditPage/" .. docTitle.prefixedText, data.editLinkDisplay)
local historyLink = makeWikilink("Special:PageHistory/" .. docTitle.prefixedText, data.historyLinkDisplay)
return "[" .. viewLink .. "] [" .. editLink .. "] [" .. historyLink .. "] [" .. purgeLink .. "]"
else
local createLink = makeUrlLink(docTitle:canonicalUrl{action = 'edit', preload = data.preload}, data.createLinkDisplay)
return "[" .. createLink .. "] [" .. purgeLink .. "]"
end
return ret
end
function p.makeStartBoxData(args, env, links)
--[=[
-- Does initial processing of data to pass to the start-box render function, p.renderStartBox.
-- @args - a table of arguments passed by the user
-- @env - environment table containing title objects, etc., generated with p.getEnvironment
-- @links - a string containing the [view][edit][history][purge] links - could be nil if there's an error.
--
-- Messages:
-- 'documentation-icon-wikitext' --> '[[File:Test Template Info-Icon - Version (2).svg|50px|link=|alt=]]'
-- 'template-namespace-heading' --> 'Template documentation'
-- 'module-namespace-heading' --> 'Module documentation'
-- 'file-namespace-heading' --> 'Summary'
-- 'other-namespaces-heading' --> 'Documentation'
-- 'testcases-create-link-display' --> 'create'
--]=]
local subjectSpace = env.subjectSpace
if not subjectSpace then
-- Default to an "other namespaces" namespace, so that we get at least some output
-- if an error occurs.
subjectSpace = 2
end
local data = {}
-- Heading
local heading = args.heading -- Blank values are not removed.
if heading == '' then
-- Don't display the start box if the heading arg is defined but blank.
return nil
end
if heading then
data.heading = heading
elseif subjectSpace == 10 then -- Template namespace
data.heading = message('documentation-icon-wikitext') .. ' ' .. message('template-namespace-heading')
elseif subjectSpace == 828 then -- Module namespace
data.heading = message('documentation-icon-wikitext') .. ' ' .. message('module-namespace-heading')
elseif subjectSpace == 6 then -- File namespace
data.heading = message('file-namespace-heading')
else
data.heading = message('other-namespaces-heading')
end
-- Heading CSS
local headingStyle = args['heading-style']
if headingStyle then
data.headingStyleText = headingStyle
else
-- 'documentation-heading'
data.headingClass = message('main-div-heading-class')
end
-- Data for the [view][edit][history][purge] or [create] links.
if links then
-- 'mw-editsection-like plainlinks'
data.linksClass = message('start-box-link-classes')
data.links = links
end
return data
end
function p.renderStartBox(data)
-- Renders the start box html.
-- @data - a table of data generated by p.makeStartBoxData.
local sbox = mw.html.create('div')
sbox
-- 'documentation-startbox'
:addClass(message('start-box-class'))
:newline()
:tag('span')
:addClass(data.headingClass)
:attr('id', 'documentation-heading')
:cssText(data.headingStyleText)
:wikitext(data.heading)
local links = data.links
if links then
sbox:tag('span')
:addClass(data.linksClass)
:attr('id', data.linksId)
:wikitext(links)
end
return tostring(sbox)
end
----------------------------------------------------------------------------
-- Documentation content
----------------------------------------------------------------------------
p.content = makeInvokeFunc('_content')
function p._content(args, env)
-- Displays the documentation contents
-- @args - a table of arguments passed by the user
-- @env - environment table containing title objects, etc., generated with p.getEnvironment
env = env or p.getEnvironment(args)
local docTitle = env.docTitle
local content = args.content
if not content and docTitle and docTitle.exists then
content = args._content or mw.getCurrentFrame():expandTemplate{title = docTitle.prefixedText}
end
-- The line breaks below are necessary so that "=== Headings ===" at the start and end
-- of docs are interpreted correctly.
return '\n' .. (content or '') .. '\n'
end
p.contentTitle = makeInvokeFunc('_contentTitle')
function p._contentTitle(args, env)
env = env or p.getEnvironment(args)
local docTitle = env.docTitle
if not args.content and docTitle and docTitle.exists then
return docTitle.prefixedText
else
return ''
end
end
----------------------------------------------------------------------------
-- End box
----------------------------------------------------------------------------
p.endBox = makeInvokeFunc('_endBox')
function p._endBox(args, env)
--[=[
-- This function generates the end box (also known as the link box).
-- @args - a table of arguments passed by the user
-- @env - environment table containing title objects, etc., generated with p.getEnvironment
--
--]=]
-- Get environment data.
env = env or p.getEnvironment(args)
local subjectSpace = env.subjectSpace
local docTitle = env.docTitle
if not subjectSpace or not docTitle then
return nil
end
-- Check whether we should output the end box at all. Add the end
-- box by default if the documentation exists or if we are in the
-- user, module or template namespaces.
local linkBox = args['link box']
if linkBox == 'off'
or not (
docTitle.exists
or subjectSpace == 2
or subjectSpace == 828
or subjectSpace == 10
)
then
return nil
end
-- Assemble the link box.
local text = ''
if linkBox then
text = text .. linkBox
else
text = text .. (p.makeDocPageBlurb(args, env) or '') -- "This documentation is transcluded from [[Foo]]."
if subjectSpace == 2 or subjectSpace == 10 or subjectSpace == 828 then
-- We are in the user, template or module namespaces.
-- Add sandbox and testcases links.
-- "Editors can experiment in this template's sandbox and testcases pages."
text = text .. (p.makeExperimentBlurb(args, env) or '') .. '<br />'
if not args.content and not args[1] then
-- "Please add categories to the /doc subpage."
-- Don't show this message with inline docs or with an explicitly specified doc page,
-- as then it is unclear where to add the categories.
text = text .. (p.makeCategoriesBlurb(args, env) or '')
end
text = text .. ' ' .. (p.makeSubpagesBlurb(args, env) or '') --"Subpages of this template"
end
end
local box = mw.html.create('div')
-- 'documentation-metadata'
box:attr('role', 'note')
:addClass(message('end-box-class'))
-- 'plainlinks'
:addClass(message('end-box-plainlinks'))
:wikitext(text)
:done()
return '\n' .. tostring(box)
end
function p.makeDocPageBlurb(args, env)
--[=[
-- Makes the blurb "This documentation is transcluded from [[Template:Foo]] (edit, history)".
-- @args - a table of arguments passed by the user
-- @env - environment table containing title objects, etc., generated with p.getEnvironment
--
-- Messages:
-- 'edit-link-display' --> 'edit'
-- 'history-link-display' --> 'history'
-- 'transcluded-from-blurb' -->
-- 'The above [[Wikipedia:Template documentation|documentation]]
-- is [[Help:Transclusion|transcluded]] from $1.'
-- 'module-preload' --> 'Template:Documentation/preload-module-doc'
-- 'create-link-display' --> 'create'
-- 'create-module-doc-blurb' -->
-- 'You might want to $1 a documentation page for this [[Wikipedia:Lua|Scribunto module]].'
--]=]
local docTitle = env.docTitle
if not docTitle then
return nil
end
if docTitle.exists then
-- /doc exists; link to it.
local docLink = makeWikilink(docTitle.prefixedText)
local editDisplay = message('edit-link-display')
local editLink = makeWikilink("Special:EditPage/" .. docTitle.prefixedText, editDisplay)
local historyDisplay = message('history-link-display')
local historyLink = makeWikilink("Special:PageHistory/" .. docTitle.prefixedText, historyDisplay)
return message('transcluded-from-blurb', {docLink})
.. ' '
.. makeToolbar(editLink, historyLink)
.. '<br />'
elseif env.subjectSpace == 828 then
-- /doc does not exist; ask to create it.
local createUrl = docTitle:canonicalUrl{action = 'edit', preload = message('module-preload')}
local createDisplay = message('create-link-display')
local createLink = makeUrlLink(createUrl, createDisplay)
return message('create-module-doc-blurb', {createLink})
.. '<br />'
end
end
function p.makeExperimentBlurb(args, env)
--[[
-- Renders the text "Editors can experiment in this template's sandbox (edit | diff) and testcases (edit) pages."
-- @args - a table of arguments passed by the user
-- @env - environment table containing title objects, etc., generated with p.getEnvironment
--
-- Messages:
-- 'sandbox-link-display' --> 'sandbox'
-- 'sandbox-edit-link-display' --> 'edit'
-- 'compare-link-display' --> 'diff'
-- 'module-sandbox-preload' --> 'Template:Documentation/preload-module-sandbox'
-- 'template-sandbox-preload' --> 'Template:Documentation/preload-sandbox'
-- 'sandbox-create-link-display' --> 'create'
-- 'mirror-edit-summary' --> 'Create sandbox version of $1'
-- 'mirror-link-display' --> 'mirror'
-- 'mirror-link-preload' --> 'Template:Documentation/mirror'
-- 'sandbox-link-display' --> 'sandbox'
-- 'testcases-link-display' --> 'testcases'
-- 'testcases-edit-link-display'--> 'edit'
-- 'template-sandbox-preload' --> 'Template:Documentation/preload-sandbox'
-- 'testcases-create-link-display' --> 'create'
-- 'testcases-link-display' --> 'testcases'
-- 'testcases-edit-link-display' --> 'edit'
-- 'module-testcases-preload' --> 'Template:Documentation/preload-module-testcases'
-- 'template-testcases-preload' --> 'Template:Documentation/preload-testcases'
-- 'experiment-blurb-module' --> 'Editors can experiment in this module's $1 and $2 pages.'
-- 'experiment-blurb-template' --> 'Editors can experiment in this template's $1 and $2 pages.'
--]]
local subjectSpace = env.subjectSpace
local templateTitle = env.templateTitle
local sandboxTitle = env.sandboxTitle
local testcasesTitle = env.testcasesTitle
local templatePage = templateTitle.prefixedText
if not subjectSpace or not templateTitle or not sandboxTitle or not testcasesTitle then
return nil
end
-- Make links.
local sandboxLinks, testcasesLinks
if sandboxTitle.exists then
local sandboxPage = sandboxTitle.prefixedText
local sandboxDisplay = message('sandbox-link-display')
local sandboxLink = makeWikilink(sandboxPage, sandboxDisplay)
local sandboxEditDisplay = message('sandbox-edit-link-display')
local sandboxEditLink = makeWikilink("Special:EditPage/" .. sandboxPage, sandboxEditDisplay)
local compareUrl = env.compareUrl
local compareLink
if compareUrl then
local compareDisplay = message('compare-link-display')
compareLink = makeUrlLink(compareUrl, compareDisplay)
end
sandboxLinks = sandboxLink .. ' ' .. makeToolbar(sandboxEditLink, compareLink)
else
local sandboxPreload
if subjectSpace == 828 then
sandboxPreload = message('module-sandbox-preload')
else
sandboxPreload = message('template-sandbox-preload')
end
local sandboxCreateUrl = sandboxTitle:canonicalUrl{action = 'edit', preload = sandboxPreload}
local sandboxCreateDisplay = message('sandbox-create-link-display')
local sandboxCreateLink = makeUrlLink(sandboxCreateUrl, sandboxCreateDisplay)
local mirrorSummary = message('mirror-edit-summary', {makeWikilink(templatePage)})
local mirrorPreload = message('mirror-link-preload')
local mirrorUrl = sandboxTitle:canonicalUrl{action = 'edit', preload = mirrorPreload, summary = mirrorSummary}
if subjectSpace == 828 then
mirrorUrl = sandboxTitle:canonicalUrl{action = 'edit', preload = templateTitle.prefixedText, summary = mirrorSummary}
end
local mirrorDisplay = message('mirror-link-display')
local mirrorLink = makeUrlLink(mirrorUrl, mirrorDisplay)
sandboxLinks = message('sandbox-link-display') .. ' ' .. makeToolbar(sandboxCreateLink, mirrorLink)
end
if testcasesTitle.exists then
local testcasesPage = testcasesTitle.prefixedText
local testcasesDisplay = message('testcases-link-display')
local testcasesLink = makeWikilink(testcasesPage, testcasesDisplay)
local testcasesEditUrl = testcasesTitle:canonicalUrl{action = 'edit'}
local testcasesEditDisplay = message('testcases-edit-link-display')
local testcasesEditLink = makeWikilink("Special:EditPage/" .. testcasesPage, testcasesEditDisplay)
-- for Modules, add testcases run link if exists
if testcasesTitle.contentModel == "Scribunto" and testcasesTitle.talkPageTitle and testcasesTitle.talkPageTitle.exists then
local testcasesRunLinkDisplay = message('testcases-run-link-display')
local testcasesRunLink = makeWikilink(testcasesTitle.talkPageTitle.prefixedText, testcasesRunLinkDisplay)
testcasesLinks = testcasesLink .. ' ' .. makeToolbar(testcasesEditLink, testcasesRunLink)
else
testcasesLinks = testcasesLink .. ' ' .. makeToolbar(testcasesEditLink)
end
else
local testcasesPreload
if subjectSpace == 828 then
testcasesPreload = message('module-testcases-preload')
else
testcasesPreload = message('template-testcases-preload')
end
local testcasesCreateUrl = testcasesTitle:canonicalUrl{action = 'edit', preload = testcasesPreload}
local testcasesCreateDisplay = message('testcases-create-link-display')
local testcasesCreateLink = makeUrlLink(testcasesCreateUrl, testcasesCreateDisplay)
testcasesLinks = message('testcases-link-display') .. ' ' .. makeToolbar(testcasesCreateLink)
end
local messageName
if subjectSpace == 828 then
messageName = 'experiment-blurb-module'
else
messageName = 'experiment-blurb-template'
end
return message(messageName, {sandboxLinks, testcasesLinks})
end
function p.makeCategoriesBlurb(args, env)
--[[
-- Generates the text "Please add categories to the /doc subpage."
-- @args - a table of arguments passed by the user
-- @env - environment table containing title objects, etc., generated with p.getEnvironment
-- Messages:
-- 'doc-link-display' --> '/doc'
-- 'add-categories-blurb' --> 'Please add categories to the $1 subpage.'
--]]
local docTitle = env.docTitle
if not docTitle then
return nil
end
local docPathLink = makeWikilink(docTitle.prefixedText, message('doc-link-display'))
return message('add-categories-blurb', {docPathLink})
end
function p.makeSubpagesBlurb(args, env)
--[[
-- Generates the "Subpages of this template" link.
-- @args - a table of arguments passed by the user
-- @env - environment table containing title objects, etc., generated with p.getEnvironment
-- Messages:
-- 'template-pagetype' --> 'template'
-- 'module-pagetype' --> 'module'
-- 'default-pagetype' --> 'page'
-- 'subpages-link-display' --> 'Subpages of this $1'
--]]
local subjectSpace = env.subjectSpace
local templateTitle = env.templateTitle
if not subjectSpace or not templateTitle then
return nil
end
local pagetype
if subjectSpace == 10 then
pagetype = message('template-pagetype')
elseif subjectSpace == 828 then
pagetype = message('module-pagetype')
else
pagetype = message('default-pagetype')
end
local subpagesLink = makeWikilink(
'Special:PrefixIndex/' .. templateTitle.prefixedText .. '/',
message('subpages-link-display', {pagetype})
)
return message('subpages-blurb', {subpagesLink})
end
----------------------------------------------------------------------------
-- Tracking categories
----------------------------------------------------------------------------
function p.addTrackingCategories(env)
--[[
-- Check if {{documentation}} is transcluded on a /doc or /testcases page.
-- @env - environment table containing title objects, etc., generated with p.getEnvironment
-- Messages:
-- 'display-strange-usage-category' --> true
-- 'doc-subpage' --> 'doc'
-- 'testcases-subpage' --> 'testcases'
-- 'strange-usage-category' --> 'Wikipedia pages with strange ((documentation)) usage'
--
-- /testcases pages in the module namespace are not categorised, as they may have
-- {{documentation}} transcluded automatically.
--]]
local title = env.title
local subjectSpace = env.subjectSpace
if not title or not subjectSpace then
return nil
end
local subpage = title.subpageText
if message('display-strange-usage-category', nil, 'boolean')
and (
subpage == message('doc-subpage')
or subjectSpace ~= 828 and subpage == message('testcases-subpage')
)
then
return makeCategoryLink(message('strange-usage-category'))
end
return ''
end
return p
d6c1bffca24be2d81fa882315ac613f5bb6b227c
Module:Documentation/config
828
74
108
107
2024-03-26T22:29:48Z
Vicht
1
1 revision imported
Scribunto
text/plain
----------------------------------------------------------------------------------------------------
--
-- Configuration for Module:Documentation
--
-- Here you can set the values of the parameters and messages used in Module:Documentation to
-- localise it to your wiki and your language. Unless specified otherwise, values given here
-- should be string values.
----------------------------------------------------------------------------------------------------
local cfg = {} -- Do not edit this line.
----------------------------------------------------------------------------------------------------
-- Protection template configuration
----------------------------------------------------------------------------------------------------
-- cfg['protection-reason-edit']
-- The protection reason for edit-protected templates to pass to
-- [[Module:Protection banner]].
cfg['protection-reason-edit'] = 'template'
--[[
----------------------------------------------------------------------------------------------------
-- Sandbox notice configuration
--
-- On sandbox pages the module can display a template notifying users that the current page is a
-- sandbox, and the location of test cases pages, etc. The module decides whether the page is a
-- sandbox or not based on the value of cfg['sandbox-subpage']. The following settings configure the
-- messages that the notices contains.
----------------------------------------------------------------------------------------------------
--]]
-- cfg['sandbox-notice-image']
-- The image displayed in the sandbox notice.
cfg['sandbox-notice-image'] = '[[File:Sandbox.svg|50px|alt=|link=]]'
--[[
-- cfg['sandbox-notice-pagetype-template']
-- cfg['sandbox-notice-pagetype-module']
-- cfg['sandbox-notice-pagetype-other']
-- The page type of the sandbox page. The message that is displayed depends on the current subject
-- namespace. This message is used in either cfg['sandbox-notice-blurb'] or
-- cfg['sandbox-notice-diff-blurb'].
--]]
cfg['sandbox-notice-pagetype-template'] = '[[Wikipedia:Template test cases|template sandbox]] page'
cfg['sandbox-notice-pagetype-module'] = '[[Wikipedia:Template test cases|module sandbox]] page'
cfg['sandbox-notice-pagetype-other'] = 'sandbox page'
--[[
-- cfg['sandbox-notice-blurb']
-- cfg['sandbox-notice-diff-blurb']
-- cfg['sandbox-notice-diff-display']
-- Either cfg['sandbox-notice-blurb'] or cfg['sandbox-notice-diff-blurb'] is the opening sentence
-- of the sandbox notice. The latter has a diff link, but the former does not. $1 is the page
-- type, which is either cfg['sandbox-notice-pagetype-template'],
-- cfg['sandbox-notice-pagetype-module'] or cfg['sandbox-notice-pagetype-other'] depending what
-- namespace we are in. $2 is a link to the main template page, and $3 is a diff link between
-- the sandbox and the main template. The display value of the diff link is set by
-- cfg['sandbox-notice-compare-link-display'].
--]]
cfg['sandbox-notice-blurb'] = 'This is the $1 for $2.'
cfg['sandbox-notice-diff-blurb'] = 'This is the $1 for $2 ($3).'
cfg['sandbox-notice-compare-link-display'] = 'diff'
--[[
-- cfg['sandbox-notice-testcases-blurb']
-- cfg['sandbox-notice-testcases-link-display']
-- cfg['sandbox-notice-testcases-run-blurb']
-- cfg['sandbox-notice-testcases-run-link-display']
-- cfg['sandbox-notice-testcases-blurb'] is a sentence notifying the user that there is a test cases page
-- corresponding to this sandbox that they can edit. $1 is a link to the test cases page.
-- cfg['sandbox-notice-testcases-link-display'] is the display value for that link.
-- cfg['sandbox-notice-testcases-run-blurb'] is a sentence notifying the user that there is a test cases page
-- corresponding to this sandbox that they can edit, along with a link to run it. $1 is a link to the test
-- cases page, and $2 is a link to the page to run it.
-- cfg['sandbox-notice-testcases-run-link-display'] is the display value for the link to run the test
-- cases.
--]]
cfg['sandbox-notice-testcases-blurb'] = 'See also the companion subpage for $1.'
cfg['sandbox-notice-testcases-link-display'] = 'test cases'
cfg['sandbox-notice-testcases-run-blurb'] = 'See also the companion subpage for $1 ($2).'
cfg['sandbox-notice-testcases-run-link-display'] = 'run'
-- cfg['sandbox-category'] - A category to add to all template sandboxes.
-- cfg['module-sandbox-category'] - A category to add to all module sandboxes.
-- cfg['module-sandbox-category'] - A category to add to all sandboxe not in templates or modules.
cfg['sandbox-category'] = 'Template sandboxes'
cfg['module-sandbox-category'] = 'Module sandboxes'
cfg['other-sandbox-category'] = 'Sandboxes outside of template or module namespace'
----------------------------------------------------------------------------------------------------
-- Start box configuration
----------------------------------------------------------------------------------------------------
-- cfg['documentation-icon-wikitext']
-- The wikitext for the icon shown at the top of the template.
cfg['documentation-icon-wikitext'] = '[[File:Test Template Info-Icon - Version (2).svg|50px|link=|alt=]]'
-- cfg['template-namespace-heading']
-- The heading shown in the template namespace.
cfg['template-namespace-heading'] = 'Template documentation'
-- cfg['module-namespace-heading']
-- The heading shown in the module namespace.
cfg['module-namespace-heading'] = 'Module documentation'
-- cfg['file-namespace-heading']
-- The heading shown in the file namespace.
cfg['file-namespace-heading'] = 'Summary'
-- cfg['other-namespaces-heading']
-- The heading shown in other namespaces.
cfg['other-namespaces-heading'] = 'Documentation'
-- cfg['view-link-display']
-- The text to display for "view" links.
cfg['view-link-display'] = 'view'
-- cfg['edit-link-display']
-- The text to display for "edit" links.
cfg['edit-link-display'] = 'edit'
-- cfg['history-link-display']
-- The text to display for "history" links.
cfg['history-link-display'] = 'history'
-- cfg['purge-link-display']
-- The text to display for "purge" links.
cfg['purge-link-display'] = 'purge'
-- cfg['create-link-display']
-- The text to display for "create" links.
cfg['create-link-display'] = 'create'
----------------------------------------------------------------------------------------------------
-- Link box (end box) configuration
----------------------------------------------------------------------------------------------------
-- cfg['transcluded-from-blurb']
-- Notice displayed when the docs are transcluded from another page. $1 is a wikilink to that page.
cfg['transcluded-from-blurb'] = 'The above [[Wikipedia:Template documentation|documentation]] is [[Help:Transclusion|transcluded]] from $1.'
--[[
-- cfg['create-module-doc-blurb']
-- Notice displayed in the module namespace when the documentation subpage does not exist.
-- $1 is a link to create the documentation page with the preload cfg['module-preload'] and the
-- display cfg['create-link-display'].
--]]
cfg['create-module-doc-blurb'] = 'You might want to $1 a documentation page for this [[Wikipedia:Lua|Scribunto module]].'
----------------------------------------------------------------------------------------------------
-- Experiment blurb configuration
----------------------------------------------------------------------------------------------------
--[[
-- cfg['experiment-blurb-template']
-- cfg['experiment-blurb-module']
-- The experiment blurb is the text inviting editors to experiment in sandbox and test cases pages.
-- It is only shown in the template and module namespaces. With the default English settings, it
-- might look like this:
--
-- Editors can experiment in this template's sandbox (edit | diff) and testcases (edit) pages.
--
-- In this example, "sandbox", "edit", "diff", "testcases", and "edit" would all be links.
--
-- There are two versions, cfg['experiment-blurb-template'] and cfg['experiment-blurb-module'], depending
-- on what namespace we are in.
--
-- Parameters:
--
-- $1 is a link to the sandbox page. If the sandbox exists, it is in the following format:
--
-- cfg['sandbox-link-display'] (cfg['sandbox-edit-link-display'] | cfg['compare-link-display'])
--
-- If the sandbox doesn't exist, it is in the format:
--
-- cfg['sandbox-link-display'] (cfg['sandbox-create-link-display'] | cfg['mirror-link-display'])
--
-- The link for cfg['sandbox-create-link-display'] link preloads the page with cfg['template-sandbox-preload']
-- or cfg['module-sandbox-preload'], depending on the current namespace. The link for cfg['mirror-link-display']
-- loads a default edit summary of cfg['mirror-edit-summary'].
--
-- $2 is a link to the test cases page. If the test cases page exists, it is in the following format:
--
-- cfg['testcases-link-display'] (cfg['testcases-edit-link-display'] | cfg['testcases-run-link-display'])
--
-- If the test cases page doesn't exist, it is in the format:
--
-- cfg['testcases-link-display'] (cfg['testcases-create-link-display'])
--
-- If the test cases page doesn't exist, the link for cfg['testcases-create-link-display'] preloads the
-- page with cfg['template-testcases-preload'] or cfg['module-testcases-preload'], depending on the current
-- namespace.
--]]
cfg['experiment-blurb-template'] = "Editors can experiment in this template's $1 and $2 pages."
cfg['experiment-blurb-module'] = "Editors can experiment in this module's $1 and $2 pages."
----------------------------------------------------------------------------------------------------
-- Sandbox link configuration
----------------------------------------------------------------------------------------------------
-- cfg['sandbox-subpage']
-- The name of the template subpage typically used for sandboxes.
cfg['sandbox-subpage'] = 'sandbox'
-- cfg['template-sandbox-preload']
-- Preload file for template sandbox pages.
cfg['template-sandbox-preload'] = 'Template:Documentation/preload-sandbox'
-- cfg['module-sandbox-preload']
-- Preload file for Lua module sandbox pages.
cfg['module-sandbox-preload'] = 'Template:Documentation/preload-module-sandbox'
-- cfg['sandbox-link-display']
-- The text to display for "sandbox" links.
cfg['sandbox-link-display'] = 'sandbox'
-- cfg['sandbox-edit-link-display']
-- The text to display for sandbox "edit" links.
cfg['sandbox-edit-link-display'] = 'edit'
-- cfg['sandbox-create-link-display']
-- The text to display for sandbox "create" links.
cfg['sandbox-create-link-display'] = 'create'
-- cfg['compare-link-display']
-- The text to display for "compare" links.
cfg['compare-link-display'] = 'diff'
-- cfg['mirror-edit-summary']
-- The default edit summary to use when a user clicks the "mirror" link. $1 is a wikilink to the
-- template page.
cfg['mirror-edit-summary'] = 'Create sandbox version of $1'
-- cfg['mirror-link-display']
-- The text to display for "mirror" links.
cfg['mirror-link-display'] = 'mirror'
-- cfg['mirror-link-preload']
-- The page to preload when a user clicks the "mirror" link.
cfg['mirror-link-preload'] = 'Template:Documentation/mirror'
----------------------------------------------------------------------------------------------------
-- Test cases link configuration
----------------------------------------------------------------------------------------------------
-- cfg['testcases-subpage']
-- The name of the template subpage typically used for test cases.
cfg['testcases-subpage'] = 'testcases'
-- cfg['template-testcases-preload']
-- Preload file for template test cases pages.
cfg['template-testcases-preload'] = 'Template:Documentation/preload-testcases'
-- cfg['module-testcases-preload']
-- Preload file for Lua module test cases pages.
cfg['module-testcases-preload'] = 'Template:Documentation/preload-module-testcases'
-- cfg['testcases-link-display']
-- The text to display for "testcases" links.
cfg['testcases-link-display'] = 'testcases'
-- cfg['testcases-edit-link-display']
-- The text to display for test cases "edit" links.
cfg['testcases-edit-link-display'] = 'edit'
-- cfg['testcases-run-link-display']
-- The text to display for test cases "run" links.
cfg['testcases-run-link-display'] = 'run'
-- cfg['testcases-create-link-display']
-- The text to display for test cases "create" links.
cfg['testcases-create-link-display'] = 'create'
----------------------------------------------------------------------------------------------------
-- Add categories blurb configuration
----------------------------------------------------------------------------------------------------
--[[
-- cfg['add-categories-blurb']
-- Text to direct users to add categories to the /doc subpage. Not used if the "content" or
-- "docname fed" arguments are set, as then it is not clear where to add the categories. $1 is a
-- link to the /doc subpage with a display value of cfg['doc-link-display'].
--]]
cfg['add-categories-blurb'] = 'Add categories to the $1 subpage.'
-- cfg['doc-link-display']
-- The text to display when linking to the /doc subpage.
cfg['doc-link-display'] = '/doc'
----------------------------------------------------------------------------------------------------
-- Subpages link configuration
----------------------------------------------------------------------------------------------------
--[[
-- cfg['subpages-blurb']
-- The "Subpages of this template" blurb. $1 is a link to the main template's subpages with a
-- display value of cfg['subpages-link-display']. In the English version this blurb is simply
-- the link followed by a period, and the link display provides the actual text.
--]]
cfg['subpages-blurb'] = '$1.'
--[[
-- cfg['subpages-link-display']
-- The text to display for the "subpages of this page" link. $1 is cfg['template-pagetype'],
-- cfg['module-pagetype'] or cfg['default-pagetype'], depending on whether the current page is in
-- the template namespace, the module namespace, or another namespace.
--]]
cfg['subpages-link-display'] = 'Subpages of this $1'
-- cfg['template-pagetype']
-- The pagetype to display for template pages.
cfg['template-pagetype'] = 'template'
-- cfg['module-pagetype']
-- The pagetype to display for Lua module pages.
cfg['module-pagetype'] = 'module'
-- cfg['default-pagetype']
-- The pagetype to display for pages other than templates or Lua modules.
cfg['default-pagetype'] = 'page'
----------------------------------------------------------------------------------------------------
-- Doc link configuration
----------------------------------------------------------------------------------------------------
-- cfg['doc-subpage']
-- The name of the subpage typically used for documentation pages.
cfg['doc-subpage'] = 'doc'
-- cfg['docpage-preload']
-- Preload file for template documentation pages in all namespaces.
cfg['docpage-preload'] = 'Template:Documentation/preload'
-- cfg['module-preload']
-- Preload file for Lua module documentation pages.
cfg['module-preload'] = 'Template:Documentation/preload-module-doc'
----------------------------------------------------------------------------------------------------
-- HTML and CSS configuration
----------------------------------------------------------------------------------------------------
-- cfg['templatestyles']
-- The name of the TemplateStyles page where CSS is kept.
-- Sandbox CSS will be at Module:Documentation/sandbox/styles.css when needed.
cfg['templatestyles'] = 'Module:Documentation/styles.css'
-- cfg['container']
-- Class which can be used to set flex or grid CSS on the
-- two child divs documentation and documentation-metadata
cfg['container'] = 'documentation-container'
-- cfg['main-div-classes']
-- Classes added to the main HTML "div" tag.
cfg['main-div-classes'] = 'documentation'
-- cfg['main-div-heading-class']
-- Class for the main heading for templates and modules and assoc. talk spaces
cfg['main-div-heading-class'] = 'documentation-heading'
-- cfg['start-box-class']
-- Class for the start box
cfg['start-box-class'] = 'documentation-startbox'
-- cfg['start-box-link-classes']
-- Classes used for the [view][edit][history] or [create] links in the start box.
-- mw-editsection-like is per [[Wikipedia:Village pump (technical)/Archive 117]]
cfg['start-box-link-classes'] = 'mw-editsection-like plainlinks'
-- cfg['end-box-class']
-- Class for the end box.
cfg['end-box-class'] = 'documentation-metadata'
-- cfg['end-box-plainlinks']
-- Plainlinks
cfg['end-box-plainlinks'] = 'plainlinks'
-- cfg['toolbar-class']
-- Class added for toolbar links.
cfg['toolbar-class'] = 'documentation-toolbar'
-- cfg['clear']
-- Just used to clear things.
cfg['clear'] = 'documentation-clear'
----------------------------------------------------------------------------------------------------
-- Tracking category configuration
----------------------------------------------------------------------------------------------------
-- cfg['display-strange-usage-category']
-- Set to true to enable output of cfg['strange-usage-category'] if the module is used on a /doc subpage
-- or a /testcases subpage. This should be a boolean value (either true or false).
cfg['display-strange-usage-category'] = true
-- cfg['strange-usage-category']
-- Category to output if cfg['display-strange-usage-category'] is set to true and the module is used on a
-- /doc subpage or a /testcases subpage.
cfg['strange-usage-category'] = 'Wikipedia pages with strange ((documentation)) usage'
--[[
----------------------------------------------------------------------------------------------------
-- End configuration
--
-- Don't edit anything below this line.
----------------------------------------------------------------------------------------------------
--]]
return cfg
56b6127664e31128dea1cecf2e392cf9313df6a3
Module:Documentation/styles.css
828
75
110
109
2024-03-26T22:29:49Z
Vicht
1
1 revision imported
sanitized-css
text/css
/* {{pp|small=yes}} */
.documentation,
.documentation-metadata {
border: 1px solid #a2a9b1;
background-color: #ecfcf4;
clear: both;
}
.documentation {
margin: 1em 0 0 0;
padding: 1em;
}
.documentation-metadata {
margin: 0.2em 0; /* same margin left-right as .documentation */
font-style: italic;
padding: 0.4em 1em; /* same padding left-right as .documentation */
}
.documentation-startbox {
padding-bottom: 3px;
border-bottom: 1px solid #aaa;
margin-bottom: 1ex;
}
.documentation-heading {
font-weight: bold;
font-size: 125%;
}
.documentation-clear { /* Don't want things to stick out where they shouldn't. */
clear: both;
}
.documentation-toolbar {
font-style: normal;
font-size: 85%;
}
html.skin-theme-clientpref-night .documentation,
html.skin-theme-clientpref-night .documentation-metadata {
background-color: inherit;
}
@media (prefers-color-scheme: dark) {
html.skin-theme-clientpref-os .documentation,
html.skin-theme-clientpref-os .documentation-metadata {
background-color: inherit;
}
}
a086e12b14e61c1254b77cddf71625c15359e806
Template:Endplainlist
10
76
112
111
2024-03-26T22:29:49Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
<includeonly></div></includeonly><noinclude>
{{documentation|Template:Plainlist/doc}}
</noinclude>
d545c41582328dd4f197e2b1848c8ad7392b92e0
Template:Sandbox other
10
77
114
113
2024-03-26T22:29:49Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
{{#if:{{#ifeq:{{#invoke:String|sublength|s={{SUBPAGENAME}}|i=0|len=7}}|sandbox|1}}{{#ifeq:{{SUBPAGENAME}}|doc|1}}{{#invoke:String|match|{{PAGENAME}}|/sandbox/styles.css$|plain=false|nomatch=}}|{{{1|}}}|{{{2|}}}}}<!--
--><noinclude>{{documentation}}</noinclude>
91e4ae891d6b791615152c1fbc971414961ba872
Template:High-use
10
78
116
115
2024-03-26T22:29:49Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
{{#invoke:High-use|main|1={{{1|}}}|2={{{2|}}}|info={{{info|}}}|demo={{{demo|}}}|form={{{form|}}}|expiry={{{expiry|}}}|system={{{system|}}}}}<noinclude>
{{Documentation}}
<!-- Add categories to the /doc subpage; interwiki links go to Wikidata, thank you! -->
</noinclude>
a3322d1bd47ac03df14fa2090855cff4fede9bc7
Module:High-use
828
79
118
117
2024-03-26T22:30:08Z
Vicht
1
1 revision imported
Scribunto
text/plain
local p = {}
-- _fetch looks at the "demo" argument.
local _fetch = require('Module:Transclusion_count').fetch
local yesno = require('Module:Yesno')
function p.num(frame, count)
if count == nil then
if yesno(frame.args['fetch']) == false then
if (frame.args[1] or '') ~= '' then count = tonumber(frame.args[1]) end
else
count = _fetch(frame)
end
end
-- Build output string
local return_value = ""
if count == nil then
if frame.args[1] == "risk" then
return "a very large number of"
else
return "many"
end
else
-- Use 2 significant figures for smaller numbers and 3 for larger ones
local sigfig = 2
if count >= 100000 then
sigfig = 3
end
-- Prepare to round to appropriate number of sigfigs
local f = math.floor(math.log10(count)) - sigfig + 1
-- Round and insert "approximately" or "+" when appropriate
if (frame.args[2] == "yes") or (mw.ustring.sub(frame.args[1],-1) == "+") then
-- Round down
return_value = string.format("%s+", mw.getContentLanguage():formatNum(math.floor( (count / 10^(f)) ) * (10^(f))) )
else
-- Round to nearest
return_value = string.format("approximately %s", mw.getContentLanguage():formatNum(math.floor( (count / 10^(f)) + 0.5) * (10^(f))) )
end
-- Insert percentage of pages if that is likely to be >= 1% and when |no-percent= not set to yes
if count and count > 250000 and not yesno (frame:getParent().args['no-percent']) then
local percent = math.floor( ( (count/frame:callParserFunction('NUMBEROFPAGES', 'R') ) * 100) + 0.5)
if percent >= 1 then
return_value = string.format("%s pages, or roughly %s%% of all", return_value, percent)
end
end
end
return return_value
end
-- Actions if there is a large (greater than or equal to 100,000) transclusion count
function p.risk(frame)
if frame.args[1] == "risk" then
return "risk"
else
local count = _fetch(frame)
if count and count >= 100000 then
return "risk"
end
end
return ""
end
function p.text(frame, count)
-- Only show the information about how this template gets updated if someone
-- is actually editing the page and maybe trying to update the count.
local bot_text = (frame:preprocess("{{REVISIONID}}") == "") and "\n\n----\n'''Preview message''': Transclusion count updated automatically ([[Template:High-use/doc#Technical details|see documentation]])." or ''
if count == nil then
if yesno(frame.args['fetch']) == false then
if (frame.args[1] or '') ~= '' then count = tonumber(frame.args[1]) end
else
count = _fetch(frame)
end
end
local title = mw.title.getCurrentTitle()
if title.subpageText == "doc" or title.subpageText == "sandbox" then
title = title.basePageTitle
end
local systemMessages = frame.args['system']
if frame.args['system'] == '' then
systemMessages = nil
end
-- This retrieves the project URL automatically to simplify localiation.
local templateCount = ('on [https://linkcount.toolforge.org/index.php?project=%s&page=%s %s pages]'):format(
mw.title.getCurrentTitle():fullUrl():gsub('//(.-)/.*', '%1'),
mw.uri.encode(title.fullText), p.num(frame, count))
local used_on_text = "'''This " .. (mw.title.getCurrentTitle().namespace == 828 and "Lua module" or "template") .. ' is used ';
if systemMessages then
used_on_text = used_on_text .. systemMessages ..
((count and count > 2000) and ("''', and " .. templateCount) or ("'''"))
else
used_on_text = used_on_text .. templateCount .. "'''"
end
local sandbox_text = ("%s's [[%s/sandbox|/sandbox]] or [[%s/testcases|/testcases]] subpages, or in your own [[%s]]. "):format(
(mw.title.getCurrentTitle().namespace == 828 and "module" or "template"),
title.fullText, title.fullText,
mw.title.getCurrentTitle().namespace == 828 and "Module:Sandbox|module sandbox" or "Wikipedia:User pages#SUB|user subpage"
)
local infoArg = frame.args["info"] ~= "" and frame.args["info"]
if (systemMessages or frame.args[1] == "risk" or (count and count >= 100000) ) then
local info = systemMessages and '.<br/>Changes to it can cause immediate changes to the Wikipedia user interface.' or '.'
if infoArg then
info = info .. "<br />" .. infoArg
end
sandbox_text = info .. '<br /> To avoid major disruption' ..
(count and count >= 100000 and ' and server load' or '') ..
', any changes should be tested in the ' .. sandbox_text ..
'The tested changes can be added to this page in a single edit. '
else
sandbox_text = (infoArg and ('.<br />' .. infoArg .. ' C') or ' and c') ..
'hanges may be widely noticed. Test changes in the ' .. sandbox_text
end
local discussion_text = systemMessages and 'Please discuss changes ' or 'Consider discussing changes '
if frame.args["2"] and frame.args["2"] ~= "" and frame.args["2"] ~= "yes" then
discussion_text = string.format("%sat [[%s]]", discussion_text, frame.args["2"])
else
discussion_text = string.format("%son the [[%s|talk page]]", discussion_text, title.talkPageTitle.fullText )
end
return used_on_text .. sandbox_text .. discussion_text .. " before implementing them." .. bot_text
end
function p.main(frame)
local count = nil
if yesno(frame.args['fetch']) == false then
if (frame.args[1] or '') ~= '' then count = tonumber(frame.args[1]) end
else
count = _fetch(frame)
end
local image = "[[File:Ambox warning yellow.svg|40px|alt=Warning|link=]]"
local type_param = "style"
local epilogue = ''
if frame.args['system'] and frame.args['system'] ~= '' then
image = "[[File:Ambox important.svg|40px|alt=Warning|link=]]"
type_param = "content"
local nocat = frame:getParent().args['nocat'] or frame.args['nocat']
local categorise = (nocat == '' or not yesno(nocat))
if categorise and not mw.title.getCurrentTitle().isRedirect then
epilogue = frame:preprocess('{{Sandbox other||{{#switch:{{#invoke:Effective protection level|{{#switch:{{NAMESPACE}}|File=upload|#default=edit}}|{{FULLPAGENAME}}}}|sysop|templateeditor|interfaceadmin=|#default=[[Category:Pages used in system messages needing protection]]}}}}')
end
elseif (frame.args[1] == "risk" or (count and count >= 100000)) then
image = "[[File:Ambox warning orange.svg|40px|alt=Warning|link=]]"
type_param = "content"
end
if frame.args["form"] == "editnotice" then
return frame:expandTemplate{
title = 'editnotice',
args = {
["image"] = image,
["text"] = p.text(frame, count),
["expiry"] = (frame.args["expiry"] or "")
}
} .. epilogue
else
return require('Module:Message box').main('ombox', {
type = type_param,
image = image,
text = p.text(frame, count),
expiry = (frame.args["expiry"] or "")
}) .. epilogue
end
end
return p
e22649bbbdf0185575aade09174113873db5066a
Module:Transclusion count
828
80
120
119
2024-03-26T22:30:08Z
Vicht
1
1 revision imported
Scribunto
text/plain
local p = {}
function p.fetch(frame)
local template = nil
local return_value = nil
-- Use demo parameter if it exists, otherswise use current template name
local namespace = mw.title.getCurrentTitle().namespace
if frame.args["demo"] and frame.args["demo"] ~= "" then
template = mw.ustring.gsub(frame.args["demo"],"^[Tt]emplate:","")
elseif namespace == 10 then -- Template namespace
template = mw.title.getCurrentTitle().text
elseif namespace == 828 then -- Module namespace
template = (mw.site.namespaces[828].name .. ":" .. mw.title.getCurrentTitle().text)
end
-- If in template or module namespace, look up count in /data
if template ~= nil then
namespace = mw.title.new(template, "Template").namespace
if namespace == 10 or namespace == 828 then
template = mw.ustring.gsub(template, "/doc$", "") -- strip /doc from end
template = mw.ustring.gsub(template, "/sandbox$", "") -- strip /sandbox from end
local index = mw.ustring.sub(mw.title.new(template).text,1,1)
local status, data = pcall(function ()
return(mw.loadData('Module:Transclusion_count/data/' .. (mw.ustring.find(index, "%a") and index or "other")))
end)
if status then
return_value = tonumber(data[mw.ustring.gsub(template, " ", "_")])
end
end
end
-- If database value doesn't exist, use value passed to template
if return_value == nil and frame.args[1] ~= nil then
local arg1=mw.ustring.match(frame.args[1], '[%d,]+')
if arg1 and arg1 ~= '' then
return_value = tonumber(frame:callParserFunction('formatnum', arg1, 'R'))
end
end
return return_value
end
-- Tabulate this data for [[Wikipedia:Database reports/Templates transcluded on the most pages]]
function p.tabulate(frame)
local list = {}
for i = 65, 91 do
local data = mw.loadData('Module:Transclusion count/data/' .. ((i == 91) and 'other' or string.char(i)))
for name, count in pairs(data) do
table.insert(list, {mw.title.new(name, "Template").fullText, count})
end
end
table.sort(list, function(a, b)
return (a[2] == b[2]) and (a[1] < b[1]) or (a[2] > b[2])
end)
local lang = mw.getContentLanguage();
for i = 1, #list do
list[i] = ('|-\n| %d || [[%s]] || %s\n'):format(i, list[i][1]:gsub('_', ' '), lang:formatNum(list[i][2]))
end
return table.concat(list)
end
return p
000ef6bcbf7b66e727870b0c300c4009da300513
Module:Lua banner
828
81
122
121
2024-03-26T22:30:08Z
Vicht
1
1 revision imported
Scribunto
text/plain
-- This module implements the {{lua}} template.
local yesno = require('Module:Yesno')
local mList = require('Module:List')
local mTableTools = require('Module:TableTools')
local mMessageBox = require('Module:Message box')
local p = {}
function p.main(frame)
local origArgs = frame:getParent().args
local args = {}
for k, v in pairs(origArgs) do
v = v:match('^%s*(.-)%s*$')
if v ~= '' then
args[k] = v
end
end
return p._main(args)
end
function p._main(args)
local modules = mTableTools.compressSparseArray(args)
local box = p.renderBox(modules)
local trackingCategories = p.renderTrackingCategories(args, modules)
return box .. trackingCategories
end
function p.renderBox(modules)
local boxArgs = {}
if #modules < 1 then
boxArgs.text = '<strong class="error">Error: no modules specified</strong>'
else
local moduleLinks = {}
for i, module in ipairs(modules) do
moduleLinks[i] = string.format('[[:%s]]', module)
local maybeSandbox = mw.title.new(module .. '/sandbox')
if maybeSandbox.exists then
moduleLinks[i] = moduleLinks[i] .. string.format(' ([[:%s|sandbox]])', maybeSandbox.fullText)
end
end
local moduleList = mList.makeList('bulleted', moduleLinks)
local title = mw.title.getCurrentTitle()
if title.subpageText == "doc" then
title = title.basePageTitle
end
if title.contentModel == "Scribunto" then
boxArgs.text = 'This module depends on the following other modules:' .. moduleList
else
boxArgs.text = 'This template uses [[Wikipedia:Lua|Lua]]:\n' .. moduleList
end
end
boxArgs.type = 'notice'
boxArgs.small = true
boxArgs.image = '[[File:Lua-Logo.svg|30px|alt=|link=]]'
return mMessageBox.main('mbox', boxArgs)
end
function p.renderTrackingCategories(args, modules, titleObj)
if yesno(args.nocat) then
return ''
end
local cats = {}
-- Error category
if #modules < 1 then
cats[#cats + 1] = 'Lua templates with errors'
end
-- Lua templates category
titleObj = titleObj or mw.title.getCurrentTitle()
local subpageBlacklist = {
doc = true,
sandbox = true,
sandbox2 = true,
testcases = true
}
if not subpageBlacklist[titleObj.subpageText] then
local protCatName
if titleObj.namespace == 10 then
local category = args.category
if not category then
local categories = {
['Module:String'] = 'Templates based on the String Lua module',
['Module:Math'] = 'Templates based on the Math Lua module',
['Module:BaseConvert'] = 'Templates based on the BaseConvert Lua module',
['Module:Citation/CS1'] = 'Templates based on the Citation/CS1 Lua module'
}
category = modules[1] and categories[modules[1]]
category = category or 'Lua-based templates'
end
cats[#cats + 1] = category
protCatName = "Templates using under-protected Lua modules"
elseif titleObj.namespace == 828 then
protCatName = "Modules depending on under-protected modules"
end
if not args.noprotcat and protCatName then
local protLevels = {
autoconfirmed = 1,
extendedconfirmed = 2,
templateeditor = 3,
sysop = 4
}
local currentProt
if titleObj.id ~= 0 then
-- id is 0 (page does not exist) if am previewing before creating a template.
currentProt = titleObj.protectionLevels["edit"][1]
end
if currentProt == nil then currentProt = 0 else currentProt = protLevels[currentProt] end
for i, module in ipairs(modules) do
if module ~= "WP:libraryUtil" then
local moduleProt = mw.title.new(module).protectionLevels["edit"][1]
if moduleProt == nil then moduleProt = 0 else moduleProt = protLevels[moduleProt] end
if moduleProt < currentProt then
cats[#cats + 1] = protCatName
break
end
end
end
end
end
for i, cat in ipairs(cats) do
cats[i] = string.format('[[Category:%s]]', cat)
end
return table.concat(cats)
end
return p
03ec1b34a40121efc562c0c64a67ebbf57d56dff
Template:Lua
10
82
124
123
2024-03-26T22:30:08Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
<includeonly>{{#invoke:Lua banner|main}}</includeonly><noinclude>
{{Lua|Module:Lua banner}}
{{documentation}}
<!-- Categories go on the /doc subpage and interwikis go on Wikidata. -->
</noinclude>
dba3962144dacd289dbc34f50fbe0a7bf6d7f2f7
Template:Clc
10
83
126
125
2024-03-26T22:30:08Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
#REDIRECT [[Template:Category link with count]]
02280e2ab57b544236e11f913e3759c5781ca9d5
Template:Category link with count
10
84
128
127
2024-03-26T22:30:08Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
[[:Category:{{#invoke:string|replace|1={{{1}}}|2=^:?[Cc]ategory:|3=|plain=false}}|<!--
-->{{#if:{{{name|}}}|{{{name}}}|Category:{{#invoke:string|replace|1={{{1}}}|2=^:?[Cc]ategory:|3=|plain=false}}}}<!--
-->]] ({{PAGESINCATEGORY:{{#invoke:string|replace|1={{{1}}}|2=^:?[Cc]ategory:|3=|plain=false}}|{{{2|all}}}}})<noinclude>
{{Documentation}}
</noinclude>
f93f1540b8c157703bd6d24ae35c35bef745981d
Template:Module other
10
85
130
129
2024-03-26T22:30:08Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
{{#switch:
<!--If no or empty "demospace" parameter then detect namespace-->
{{#if:{{{demospace|}}}
| {{lc: {{{demospace}}} }} <!--Use lower case "demospace"-->
| {{#ifeq:{{NAMESPACE}}|{{ns:Module}}
| module
| other
}}
}}
| module = {{{1|}}}
| other
| #default = {{{2|}}}
}}<!--End switch--><noinclude>
{{documentation}}
<!-- Add categories to the /doc subpage, not here! -->
</noinclude>
503694836c1b07142e63fd35d8be69ec8bb9ffe7
Template:Lua sidebar
10
86
132
131
2024-03-26T22:30:08Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
{{Sidebar
| class = lua-sidebar
| templatestyles = Template:Lua sidebar/styles.css
| title = Related pages
| content1 = {{plainlist}}
* [[Template:{{{template|{{{title|{{BASEPAGENAME}}}}}}}}|Template]] {{#if:{{#invoke:redirect|isRedirect|Template talk:{{{template|{{{title|{{BASEPAGENAME}}}}}}}}}}||([[Template talk:{{{template|{{{title|{{BASEPAGENAME}}}}}}}}|talk]])}}
* [[Template:{{{template|{{{title|{{BASEPAGENAME}}}}}}}}/sandbox|Template sandbox]]
* [[Template:{{{template|{{{title|{{BASEPAGENAME}}}}}}}}/testcases|Template testcases]]
* [[Template:{{{template|{{{title|{{BASEPAGENAME}}}}}}}}/doc|Template doc]]
* [[Special:PrefixIndex/Template:{{{template|{{{title|{{BASEPAGENAME}}}}}}}}/|Template subpages]]
* [[Module:{{{module|{{{title|{{BASEPAGENAME}}}}}}}}|Module]] {{#if:{{#invoke:redirect|isRedirect|Module talk:{{{module|{{{title|{{BASEPAGENAME}}}}}}}}}}||([[Module talk:{{{module|{{{title|{{BASEPAGENAME}}}}}}}}|talk]])}}
* [[Module:{{{module|{{{title|{{BASEPAGENAME}}}}}}}}/sandbox|Module sandbox]]
* [[Module talk:{{{module|{{{title|{{BASEPAGENAME}}}}}}}}/testcases|Module testcases]]
* [[Module:{{{module|{{{title|{{BASEPAGENAME}}}}}}}}/doc|Module doc]]
* [[Special:PrefixIndex/Module:{{{module|{{{title|{{BASEPAGENAME}}}}}}}}/|Module subpages]]
{{endplainlist}}
| content2 = {{{1|}}}
}}<noinclude>
{{Documentation}}
</noinclude>
f11e49d67a400d29f6d73720fea7eb5a273ab663
Template:Lua sidebar/styles.css
10
87
134
133
2024-03-26T22:30:09Z
Vicht
1
1 revision imported
sanitized-css
text/css
.lua-sidebar {
width: auto;
max-width: 22em;
}
9984d36eb49fae70dd00527c993784d775409a6b
Module:Transclusion count/data/N
828
88
136
135
2024-03-26T22:30:09Z
Vicht
1
1 revision imported
Scribunto
text/plain
return {
["N"] = 2700,
["N.b."] = 2000,
["N/A"] = 25000,
["N/a"] = 58000,
["NA-Class"] = 15000,
["NASCAR_next_race"] = 2000,
["NASTRO_comment"] = 31000,
["NBA_Draft_template_list"] = 3400,
["NBA_Year"] = 5700,
["NBA_color"] = 3600,
["NBA_color_cell"] = 4300,
["NBA_color_cell2"] = 3400,
["NBA_player_statistics_legend"] = 4700,
["NBA_player_statistics_start"] = 4000,
["NBbox"] = 3400,
["NCAA_color_cell"] = 11000,
["NCAA_secondary_color_cell"] = 4400,
["NCES_District_ID"] = 2700,
["NED"] = 9800,
["NEXTYEAR"] = 8000,
["NFLAltPrimaryStyle"] = 2300,
["NFLPrimaryStyle"] = 27000,
["NFLSecondaryColor"] = 18000,
["NFL_Roster_navbox_template_list"] = 2500,
["NFL_Year"] = 25000,
["NFL_predraft"] = 6900,
["NFL_predraft/check"] = 6900,
["NFL_predraft/ftin"] = 6900,
["NFLplayer"] = 2100,
["NFT"] = 7000,
["NFT_player"] = 31000,
["NGA"] = 3300,
["NGR"] = 2400,
["NHLE"] = 19000,
["NHLS_url"] = 2200,
["NLD"] = 11000,
["NLM_content"] = 2800,
["NOINDEX"] = 459000,
["NOMIS2011"] = 2300,
["NOR"] = 9600,
["NPG_name"] = 2100,
["NRDB_species"] = 7000,
["NRHP-PA"] = 2600,
["NRHPGoogleMapFootnote"] = 2500,
["NRHP_Focus"] = 73000,
["NRHP_color"] = 3700,
["NRHP_date_for_lists"] = 3100,
["NRHP_date_for_lists/dates"] = 3100,
["NRHP_header"] = 3400,
["NRHP_navigation_box"] = 8400,
["NRHP_row"] = 3400,
["NRHP_style"] = 70000,
["NRHP_url"] = 29000,
["NRHP_url/core"] = 31000,
["NRISref"] = 73000,
["NSWcity"] = 2100,
["NSWcity/core"] = 2100,
["NUMBEROFSECTIONS"] = 2100,
["NYCS_br"] = 2700,
["NYCS_time_2"] = 3100,
["NZL"] = 6800,
["NZ_electorate_link"] = 2500,
["Na"] = 2700,
["Nac"] = 3000,
["Namespace_detect"] = 572000,
["Namespace_detect_showall"] = 7200,
["Nastaliq"] = 11000,
["Nat_fs_end"] = 2500,
["National_Film_Awards/style"] = 2100,
["National_Heritage_List_for_England"] = 23000,
["National_Rail_style"] = 5800,
["National_Register_of_Historic_Places"] = 29000,
["National_Register_of_Historic_Places_in_Massachusetts"] = 4400,
["National_Register_of_Historic_Places_in_New_York"] = 5600,
["National_Register_of_Historic_Places_in_North_Carolina"] = 2900,
["National_Register_of_Historic_Places_in_Pennsylvania"] = 3200,
["National_Register_of_Historic_Places_in_Virginia"] = 3100,
["National_basketball_squad"] = 3200,
["National_field_hockey_squad"] = 4100,
["National_football_squad_end"] = 3000,
["National_football_squad_start/styles.css"] = 2400,
["National_rugby_union_team"] = 4500,
["National_squad"] = 42000,
["National_squad_no_numbers"] = 17000,
["National_volleyball_team"] = 2400,
["Native_name"] = 20000,
["Native_name_checker"] = 83000,
["Naval"] = 3800,
["Naval/core"] = 3800,
["Navbar"] = 39000,
["Navbar-collapsible"] = 3400,
["Navbar-header"] = 16000,
["Navbar-header/styles.css"] = 16000,
["Navbox"] = 2910000,
["Navbox_GR_munic"] = 3500,
["Navbox_Musical_artist"] = 9900,
["Navbox_bottom"] = 16000,
["Navbox_decade_list"] = 11000,
["Navbox_documentation"] = 35000,
["Navbox_ice_hockey"] = 3200,
["Navbox_musical_artist"] = 228000,
["Navbox_musical_artist/color"] = 228000,
["Navbox_rugby_league_squad"] = 5000,
["Navbox_season_by_team"] = 3200,
["Navbox_top"] = 16000,
["Navbox_visibility"] = 35000,
["Navbox_with_collapsible_groups"] = 137000,
["Navbox_with_collapsible_sections"] = 2400,
["Navbox_with_columns"] = 26000,
["Navboxes"] = 58000,
["Navboxes_colour"] = 4600,
["Navseasoncats"] = 230000,
["Navseasoncats_with_centuries_below_decade"] = 6700,
["Navseasoncats_with_decades_below_year"] = 16000,
["Navsource"] = 2500,
["Navy"] = 20000,
["Navy/core"] = 20000,
["Nay"] = 5900,
["Nbay"] = 5700,
["Nbhyph"] = 194000,
["Nbsp"] = 498000,
["Nbsp_to_space"] = 21000,
["Ndash"] = 23000,
["Nee"] = 11000,
["NeilBrownPlayers"] = 3100,
["New_user_bar"] = 57000,
["Newbot"] = 4300,
["Next_period"] = 22000,
["Nfly"] = 2300,
["Nihongo"] = 104000,
["Nihongo2"] = 12000,
["Nihongo_foot"] = 2700,
["No"] = 9100,
["No."] = 14000,
["No2"] = 11000,
["NoSpam"] = 3900,
["NoSpamEmail"] = 17000,
["No_col_break"] = 2400,
["No_col_break/styles.css"] = 2400,
["No_documentation"] = 2500,
["No_footnotes"] = 51000,
["No_ping"] = 383000,
["No_plot"] = 9100,
["No_redirect"] = 601000,
["No_spam"] = 297000,
["No_wrap"] = 2900,
["Nobold"] = 403000,
["Nobold/styles.css"] = 403000,
["Nobr"] = 5300,
["Nobreak"] = 681000,
["Nochange"] = 2600,
["Noindex"] = 4700,
["Noitalic"] = 4700,
["Noitalic/styles.css"] = 4700,
["Nom"] = 43000,
["Nominated"] = 7800,
["Non-English-language_text_category"] = 2700,
["Non-admin_closure"] = 3200,
["Non-admin_closure_(requested_moves)"] = 4600,
["Non-admin_comment"] = 2100,
["Non-album_single"] = 2200,
["Non-diffusing_subcategory"] = 17000,
["Non-free_2D_art"] = 7600,
["Non-free_3D_art"] = 2500,
["Non-free_album_cover"] = 213000,
["Non-free_audio_sample"] = 8500,
["Non-free_biog-pic"] = 27000,
["Non-free_book_cover"] = 56000,
["Non-free_character"] = 2500,
["Non-free_comic"] = 11000,
["Non-free_fair_use"] = 17000,
["Non-free_fair_use_in"] = 14000,
["Non-free_file_with_no_commercial_use_license"] = 2400,
["Non-free_film_poster"] = 28000,
["Non-free_film_screenshot"] = 5000,
["Non-free_game_cover"] = 8100,
["Non-free_game_screenshot"] = 5000,
["Non-free_historic_image"] = 16000,
["Non-free_image_data"] = 8400,
["Non-free_image_rationale"] = 9500,
["Non-free_logo"] = 157000,
["Non-free_magazine_cover"] = 7700,
["Non-free_media"] = 756000,
["Non-free_media_data"] = 9600,
["Non-free_media_rationale"] = 11000,
["Non-free_movie_poster"] = 25000,
["Non-free_music_video_screenshot"] = 2000,
["Non-free_newspaper_image"] = 2100,
["Non-free_poster"] = 82000,
["Non-free_promotional"] = 8800,
["Non-free_school_logo"] = 7500,
["Non-free_seal"] = 6600,
["Non-free_symbol"] = 5700,
["Non-free_television_screenshot"] = 16000,
["Non-free_title-card"] = 6300,
["Non-free_use_rationale"] = 699000,
["Non-free_use_rationale/styles.css"] = 709000,
["Non-free_use_rationale_2"] = 211000,
["Non-free_use_rationale_album_cover"] = 145000,
["Non-free_use_rationale_biog"] = 2100,
["Non-free_use_rationale_book_cover"] = 19000,
["Non-free_use_rationale_logo"] = 108000,
["Non-free_use_rationale_poster"] = 54000,
["Non-free_use_rationale_title-card"] = 3300,
["Non-free_use_rationale_video_cover"] = 6100,
["Non-free_use_rationale_video_game_cover"] = 11000,
["Non-free_video_cover"] = 16000,
["Non-free_video_game_cover"] = 22000,
["Non-free_video_game_cover/platform"] = 22000,
["Non-free_video_game_screenshot"] = 11000,
["Non-free_video_game_screenshot/platform"] = 9900,
["Non-free_with_NC"] = 2400,
["Non-free_with_permission"] = 2000,
["Non_breaking_hyphen"] = 195000,
["Nonumtoc"] = 2800,
["Nonumtoc/styles.css"] = 2800,
["Noping"] = 370000,
["Noplot"] = 2300,
["Noprint"] = 2900,
["Noredirect"] = 8400,
["Normal"] = 6700,
["Normalwraplink"] = 4900,
["North_America_topic"] = 3600,
["Nospam"] = 5300,
["Not-PD-US-expired-min-year"] = 26000,
["Not_a_ballot"] = 7900,
["Not_a_forum"] = 7800,
["Not_a_typo"] = 12000,
["Not_around"] = 8500,
["Not_done"] = 21000,
["Notability"] = 60000,
["Notavote"] = 2200,
["Notdone"] = 5700,
["Note"] = 25000,
["NoteFoot"] = 4500,
["NoteTag"] = 4600,
["Note_label"] = 9100,
["Notelist"] = 210000,
["Notelist-lr"] = 3800,
["Notelist-ua"] = 7400,
["Notes"] = 5600,
["Noteslist"] = 3500,
["Notice"] = 116000,
["NovelsWikiProject"] = 2400,
["Nowiki_="] = 2300,
["Nowrap"] = 1520000,
["Np"] = 3500,
["Npby"] = 2600,
["Nq"] = 4200,
["Nrut"] = 4500,
["Ns"] = 2900,
["Ns0"] = 110000,
["Ns_has_subpages"] = 2530000,
["Nts"] = 21000,
["Ntsh"] = 3400,
["Number_of_defined_parameters"] = 5300,
["Number_table_sorting"] = 36000,
["Number_table_sorting_hidden"] = 3400,
["Numero"] = 3700,
["Nutshell"] = 4000,
["Nw="] = 2300,
["Née"] = 2300,
["Module:NUMBEROFSECTIONS"] = 2100,
["Module:Namespace_detect"] = 625000,
["Module:Namespace_detect/config"] = 4940000,
["Module:Namespace_detect/data"] = 4940000,
["Module:National_squad"] = 55000,
["Module:Native_name"] = 97000,
["Module:Navbar"] = 5530000,
["Module:Navbar/configuration"] = 5530000,
["Module:Navbar/styles.css"] = 4860000,
["Module:Navbox"] = 4550000,
["Module:Navbox/configuration"] = 4550000,
["Module:Navbox/styles.css"] = 4550000,
["Module:Navbox_ice_hockey"] = 3200,
["Module:Navbox_top_and_bottom"] = 16000,
["Module:Navbox_with_collapsible_groups"] = 147000,
["Module:Navboxes"] = 59000,
["Module:Nihongo"] = 106000,
["Module:No_ping"] = 457000,
["Module:Noinclude"] = 5300,
["Module:Ns_has_subpages"] = 2530000,
["Module:Number_table_sorting"] = 38000,
}
1949a3e0df8144f6faa34c27923f8dc10f9e27c4
Template:Uses TemplateStyles
10
90
140
139
2024-03-26T22:30:09Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
<includeonly>{{#invoke:Uses TemplateStyles|main}}</includeonly><noinclude>{{documentation}}
<!-- Categories go on the /doc subpage and interwikis go on Wikidata. -->
</noinclude>
60f2fc73c4d69b292455879f9fcb3c68f6c63c2a
Module:Uses TemplateStyles
828
91
142
141
2024-03-26T22:30:09Z
Vicht
1
1 revision imported
Scribunto
text/plain
local yesno = require('Module:Yesno')
local mList = require('Module:List')
local mTableTools = require('Module:TableTools')
local mMessageBox = require('Module:Message box')
local TNT = require('Module:TNT')
local p = {}
local function format(msg, ...)
return TNT.format('I18n/Uses TemplateStyles', msg, ...)
end
local function getConfig()
return mw.loadData('Module:Uses TemplateStyles/config')
end
local function renderBox(tStyles)
local boxArgs = {
type = 'notice',
small = true,
image = string.format('[[File:Farm-Fresh css add.svg|32px|alt=%s]]', format('logo-alt'))
}
if #tStyles < 1 then
boxArgs.text = string.format('<strong class="error">%s</strong>', format('error-emptylist'))
else
local cfg = getConfig()
local tStylesLinks = {}
for i, ts in ipairs(tStyles) do
local link = string.format('[[:%s]]', ts)
local sandboxLink = nil
local tsTitle = mw.title.new(ts)
if tsTitle and cfg['sandbox_title'] then
local tsSandboxTitle = mw.title.new(string.format(
'%s:%s/%s/%s', tsTitle.nsText, tsTitle.baseText, cfg['sandbox_title'], tsTitle.subpageText))
if tsSandboxTitle and tsSandboxTitle.exists then
sandboxLink = format('sandboxlink', link, ':' .. tsSandboxTitle.prefixedText)
end
end
tStylesLinks[i] = sandboxLink or link
end
local tStylesList = mList.makeList('bulleted', tStylesLinks)
boxArgs.text = format(
mw.title.getCurrentTitle():inNamespaces(828,829) and 'header-module' or 'header-template') ..
'\n' .. tStylesList
end
return mMessageBox.main('mbox', boxArgs)
end
local function renderTrackingCategories(args, tStyles, titleObj)
if yesno(args.nocat) then
return ''
end
local cfg = getConfig()
local cats = {}
-- Error category
if #tStyles < 1 and cfg['error_category'] then
cats[#cats + 1] = cfg['error_category']
end
-- TemplateStyles category
titleObj = titleObj or mw.title.getCurrentTitle()
if (titleObj.namespace == 10 or titleObj.namespace == 828)
and not cfg['subpage_blacklist'][titleObj.subpageText]
then
local category = args.category or cfg['default_category']
if category then
cats[#cats + 1] = category
end
if not yesno(args.noprotcat) and (cfg['protection_conflict_category'] or cfg['padlock_pattern']) then
local currentProt = titleObj.protectionLevels["edit"] and titleObj.protectionLevels["edit"][1] or nil
local addedLevelCat = false
local addedPadlockCat = false
for i, ts in ipairs(tStyles) do
local tsTitleObj = mw.title.new(ts)
local tsProt = tsTitleObj.protectionLevels["edit"] and tsTitleObj.protectionLevels["edit"][1] or nil
if cfg['padlock_pattern'] and tsProt and not addedPadlockCat then
local content = tsTitleObj:getContent()
if not content:find(cfg['padlock_pattern']) then
cats[#cats + 1] = cfg['missing_padlock_category']
addedPadlockCat = true
end
end
if cfg['protection_conflict_category'] and currentProt and tsProt ~= currentProt and not addedLevelCat then
currentProt = cfg['protection_hierarchy'][currentProt] or 0
tsProt = cfg['protection_hierarchy'][tsProt] or 0
if tsProt < currentProt then
addedLevelCat = true
cats[#cats + 1] = cfg['protection_conflict_category']
end
end
end
end
end
for i, cat in ipairs(cats) do
cats[i] = string.format('[[Category:%s]]', cat)
end
return table.concat(cats)
end
function p._main(args, cfg)
local tStyles = mTableTools.compressSparseArray(args)
local box = renderBox(tStyles)
local trackingCategories = renderTrackingCategories(args, tStyles)
return box .. trackingCategories
end
function p.main(frame)
local origArgs = frame:getParent().args
local args = {}
for k, v in pairs(origArgs) do
v = v:match('^%s*(.-)%s*$')
if v ~= '' then
args[k] = v
end
end
return p._main(args)
end
return p
71ca57c37849f38e3c5ee30061bdae730963e48e
Module:Uses TemplateStyles/config
828
92
144
143
2024-03-26T22:30:09Z
Vicht
1
1 revision imported
Scribunto
text/plain
local cfg = {} -- Don’t touch this line.
-- Subpage blacklist: these subpages will not be categorized (except for the
-- error category, which is always added if there is an error).
-- For example “Template:Foo/doc” matches the `doc = true` rule, so it will have
-- no categories. “Template:Foo” and “Template:Foo/documentation” match no rules,
-- so they *will* have categories. All rules should be in the
-- ['<subpage name>'] = true,
-- format.
cfg['subpage_blacklist'] = {
['doc'] = true,
['sandbox'] = true,
['sandbox2'] = true,
['testcases'] = true,
}
-- Sandbox title: if the stylesheet’s title is <template>/<stylesheet>.css, the
-- stylesheet’s sandbox is expected to be at <template>/<sandbox_title>/<stylesheet>.css
-- Set to nil to disable sandbox links.
cfg['sandbox_title'] = 'sandbox'
-- Error category: this category is added if the module call contains errors
-- (e.g. no stylesheet listed). A category name without namespace, or nil
-- to disable categorization (not recommended).
cfg['error_category'] = 'Uses TemplateStyles templates with errors'
-- Default category: this category is added if no custom category is specified
-- in module/template call. A category name without namespace, or nil
-- to disable categorization.
cfg['default_category'] = 'Templates using TemplateStyles'
-- Protection conflict category: this category is added if the protection level
-- of any stylesheet is lower than the protection level of the template. A category name
-- without namespace, or nil to disable categorization (not recommended).
cfg['protection_conflict_category'] = 'Templates using TemplateStyles with a different protection level'
-- Hierarchy of protection levels, used to determine whether one protection level is lower
-- than another and thus should populate protection_conflict_category. No protection is treated as zero
cfg['protection_hierarchy'] = {
autoconfirmed = 1,
extendedconfirmed = 2,
templateeditor = 3,
sysop = 4
}
-- Padlock pattern: Lua pattern to search on protected stylesheets for, or nil
-- to disable padlock check.
cfg['padlock_pattern'] = '{{pp-'
-- Missing padlock category: this category is added if a protected stylesheet
-- doesn’t contain any padlock template (specified by the above Lua pattern).
-- A category name without namespace (no nil allowed) if the pattern is not nil,
-- unused (and thus may be nil) otherwise.
cfg['missing_padlock_category'] = 'Templates using TemplateStyles without padlocks'
return cfg -- Don’t touch this line.
58e7a37c44f6ea3f6b8af54a559d696cc7256493
Template:High use
10
93
146
145
2024-03-26T22:30:09Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
#Redirect [[Template:High-use]]
{{Redirect category shell|{{R from modification}}{{R from template shortcut}}}}
65ce33c8f2d9659b46256ceb1f7fe57859f66fb2
Module:Message box/ombox.css
828
94
148
147
2024-03-26T22:30:09Z
Vicht
1
1 revision imported
sanitized-css
text/css
/* {{pp|small=y}} */
.ombox {
margin: 4px 0;
border-collapse: collapse;
border: 1px solid #a2a9b1; /* Default "notice" gray */
background-color: #f8f9fa;
box-sizing: border-box;
}
/* For the "small=yes" option. */
.ombox.mbox-small {
font-size: 88%;
line-height: 1.25em;
}
.ombox-speedy {
border: 2px solid #b32424; /* Red */
background-color: #fee7e6; /* Pink */
}
.ombox-delete {
border: 2px solid #b32424; /* Red */
}
.ombox-content {
border: 1px solid #f28500; /* Orange */
}
.ombox-style {
border: 1px solid #fc3; /* Yellow */
}
.ombox-move {
border: 1px solid #9932cc; /* Purple */
}
.ombox-protection {
border: 2px solid #a2a9b1; /* Gray-gold */
}
.ombox .mbox-text {
border: none;
/* @noflip */
padding: 0.25em 0.9em;
width: 100%;
}
.ombox .mbox-image {
border: none;
/* @noflip */
padding: 2px 0 2px 0.9em;
text-align: center;
}
.ombox .mbox-imageright {
border: none;
/* @noflip */
padding: 2px 0.9em 2px 0;
text-align: center;
}
/* An empty narrow cell */
.ombox .mbox-empty-cell {
border: none;
padding: 0;
width: 1px;
}
.ombox .mbox-invalid-type {
text-align: center;
}
@media (min-width: 720px) {
.ombox {
margin: 4px 10%;
}
.ombox.mbox-small {
/* @noflip */
clear: right;
/* @noflip */
float: right;
/* @noflip */
margin: 4px 0 4px 1em;
width: 238px;
}
}
8fe3df4bb607e699eab2dbd23bd4a1a446391002
Module:Navbox/doc
828
95
150
149
2024-03-26T22:30:10Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
{{high use}}
{{module rating|protected}}
{{Lua|Module:Navbox/configuration|Module:Navbar|Module:Color contrast|Module:Arguments}}
{{Uses TemplateStyles|Module:Navbox/styles.css|Template:Plainlist/styles.css|Template:Hlist/styles.css}}
{{Lua sidebar}}
This module implements the {{tl|Navbox}} template. Please see the [[Template:Navbox|template page]] for usage instructions.
== Tracking/maintenance categories ==
* {{clc|Navbox orphans}}
* {{clc|Navigational boxes without horizontal lists}}
* {{clc|Navboxes using background colours}}
* {{clc|Potentially illegible navboxes}}
* {{clc|Navboxes using borders}}
<includeonly>{{sandbox other||
[[Category:Modules that add a tracking category]]
[[Category:Modules that check for strip markers]]
}}</includeonly>
5abb15d141e269f9d660b73b3fa4391779c7684f
Template:Plainlist/styles.css
10
96
152
151
2024-03-26T22:30:10Z
Vicht
1
1 revision imported
sanitized-css
text/css
/* {{pp-template|small=yes}} */
.plainlist ol,
.plainlist ul {
line-height: inherit;
list-style: none;
margin: 0;
padding: 0; /* Reset Minerva default */
}
.plainlist ol li,
.plainlist ul li {
margin-bottom: 0;
}
51706efa229ff8794c0d94f260a208e7c5e6ec30
Template:Hlist/styles.css
10
97
154
153
2024-03-26T22:30:10Z
Vicht
1
1 revision imported
sanitized-css
text/css
/* {{pp-protected|reason=match parent|small=yes}} */
/*
* hlist styles are defined in core and Minerva and differ in Minerva. The
* current definitions here (2023-01-01) are sufficient to override Minerva
* without use of the hlist-separated class. The most problematic styles were
* related to margin, padding, and the bullet. Check files listed at
* [[MediaWiki talk:Common.css/to do#hlist-separated]]
*/
/*
* TODO: When the majority of readership supports it (or some beautiful world
* in which grade C support is above the minimum threshold), use :is()
*/
.hlist dl,
.hlist ol,
.hlist ul {
margin: 0;
padding: 0;
}
/* Display list items inline */
.hlist dd,
.hlist dt,
.hlist li {
/*
* don't trust the note that says margin doesn't work with inline
* removing margin: 0 makes dds have margins again
* We also want to reset margin-right in Minerva
*/
margin: 0;
display: inline;
}
/* Display requested top-level lists inline */
.hlist.inline,
.hlist.inline dl,
.hlist.inline ol,
.hlist.inline ul,
/* Display nested lists inline */
.hlist dl dl,
.hlist dl ol,
.hlist dl ul,
.hlist ol dl,
.hlist ol ol,
.hlist ol ul,
.hlist ul dl,
.hlist ul ol,
.hlist ul ul {
display: inline;
}
/* Hide empty list items */
.hlist .mw-empty-li {
display: none;
}
/* TODO: :not() can maybe be used here to remove the later rule. naive test
* seems to work. more testing needed. like so:
*.hlist dt:not(:last-child)::after {
* content: ": ";
*}
*.hlist dd:not(:last-child)::after,
*.hlist li:not(:last-child)::after {
* content: " · ";
* font-weight: bold;
*}
*/
/* Generate interpuncts */
.hlist dt::after {
content: ": ";
}
.hlist dd::after,
.hlist li::after {
content: " · ";
font-weight: bold;
}
.hlist dd:last-child::after,
.hlist dt:last-child::after,
.hlist li:last-child::after {
content: none;
}
/* Add parentheses around nested lists */
.hlist dd dd:first-child::before,
.hlist dd dt:first-child::before,
.hlist dd li:first-child::before,
.hlist dt dd:first-child::before,
.hlist dt dt:first-child::before,
.hlist dt li:first-child::before,
.hlist li dd:first-child::before,
.hlist li dt:first-child::before,
.hlist li li:first-child::before {
content: " (";
font-weight: normal;
}
.hlist dd dd:last-child::after,
.hlist dd dt:last-child::after,
.hlist dd li:last-child::after,
.hlist dt dd:last-child::after,
.hlist dt dt:last-child::after,
.hlist dt li:last-child::after,
.hlist li dd:last-child::after,
.hlist li dt:last-child::after,
.hlist li li:last-child::after {
content: ")";
font-weight: normal;
}
/* Put ordinals in front of ordered list items */
.hlist ol {
counter-reset: listitem;
}
.hlist ol > li {
counter-increment: listitem;
}
.hlist ol > li::before {
content: " " counter(listitem) "\a0";
}
.hlist dd ol > li:first-child::before,
.hlist dt ol > li:first-child::before,
.hlist li ol > li:first-child::before {
content: " (" counter(listitem) "\a0";
}
8c9dd9c9c00f30eead17fe10f51d183333e81f33
Template:DMCA
10
98
156
155
2024-03-26T22:42:03Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
#REDIRECT [[Template:Dated maintenance category (articles)]]
{{Redirect category shell|
{{R from move}}
{{R from modification}}
{{R from template shortcut}}
}}
711d3f1c53fa704297f675a8dcf1a56719c5b654
Template:Dated maintenance category
10
99
158
157
2024-03-26T22:42:03Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
<nowiki/><!--This nowiki helps to prevent whitespace at the top of articles-->{{#ifeq:{{FULLROOTPAGENAME}}|Wikipedia:Template messages|<!--Do not categorize-->|<!--
-->{{#ifexpr:{{#if:{{NAMESPACE}}|0|1}}+{{#ifeq:{{{onlyarticles|no}}}|yes|0|1}}
|{{#if:{{{3|}}}
|[[Category:{{{1}}} {{{2}}} {{{3}}}]]<!--
-->{{#ifexist:Category:{{{1}}} {{{2}}} {{{3}}}
|<!--
-->|[[Category:Articles with invalid date parameter in template]]<!--
-->}}
|[[Category:{{#if:{{{5|}}}
|{{{5}}}<!--
-->|{{{1}}}<!--
-->}}]]<!--
-->}}{{#if:{{{4|}}}
|[[Category:{{{4}}}]]}}<!--
-->}}<!--
-->}}<noinclude>
{{documentation}}
</noinclude>
41e7d4000124d4f718ddf222af0b72825048c4c4
Template:FULLROOTPAGENAME
10
100
160
159
2024-03-26T22:42:03Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
{{ safesubst:<noinclude/>#if: {{ safesubst:<noinclude/>Ns has subpages | {{ safesubst:<noinclude/>#if:{{{1|}}}|{{ safesubst:<noinclude/>NAMESPACE:{{{1}}}}}|{{ safesubst:<noinclude/>NAMESPACE}}}} }}
| {{ safesubst:<noinclude/>#titleparts:{{ safesubst:<noinclude/>#if:{{{1|}}}|{{{1}}}|{{ safesubst:<noinclude/>FULLPAGENAME}}}}|1}}
| {{ safesubst:<noinclude/>#if:{{{1|}}}|{{{1}}}|{{ safesubst:<noinclude/>FULLPAGENAME}}}}
}}<noinclude>
{{documentation}}
</noinclude>
fd0c4e7050dded2d50e5df405e6e5e31dd0d46ac
Template:Ns has subpages
10
101
162
161
2024-03-26T22:42:03Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
{{<includeonly>safesubst:</includeonly>#invoke:Ns has subpages|main}}<noinclude>
{{documentation}}
<!-- Categories go on the /doc subpage and interwikis go on Wikidata. -->
</noinclude>
060d2d01af26cb67fd90a7c346a0d2d5e450a040
Module:Ns has subpages
828
102
164
163
2024-03-26T22:42:03Z
Vicht
1
1 revision imported
Scribunto
text/plain
-- This module implements [[Template:Ns has subpages]].
-- While the template is fairly simple, this information is made available to
-- Lua directly, so using a module means that we don't have to update the
-- template as new namespaces are added.
local p = {}
function p._main(ns, frame)
-- Get the current namespace if we were not passed one.
if not ns then
ns = mw.title.getCurrentTitle().namespace
end
-- Look up the namespace table from mw.site.namespaces. This should work
-- for a majority of cases.
local nsTable = mw.site.namespaces[ns]
-- Try using string matching to get the namespace from page names.
-- Do a quick and dirty bad title check to try and make sure we do the same
-- thing as {{NAMESPACE}} in most cases.
if not nsTable and type(ns) == 'string' and not ns:find('[<>|%[%]{}]') then
local nsStripped = ns:gsub('^[_%s]*:', '')
nsStripped = nsStripped:gsub(':.*$', '')
nsTable = mw.site.namespaces[nsStripped]
end
-- If we still have no match then try the {{NAMESPACE}} parser function,
-- which should catch the remainder of cases. Don't use a mw.title object,
-- as this would increment the expensive function count for each new page
-- tested.
if not nsTable then
frame = frame or mw.getCurrentFrame()
local nsProcessed = frame:callParserFunction('NAMESPACE', ns)
nsTable = nsProcessed and mw.site.namespaces[nsProcessed]
end
return nsTable and nsTable.hasSubpages
end
function p.main(frame)
local ns = frame:getParent().args[1]
if ns then
ns = ns:match('^%s*(.-)%s*$') -- trim whitespace
ns = tonumber(ns) or ns
end
local hasSubpages = p._main(ns, frame)
return hasSubpages and 'yes' or ''
end
return p
e133068ba73738b16e1e3eba47735516a461eb5b
Template:Yesno
10
103
166
165
2024-03-26T22:42:03Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
{{<includeonly>safesubst:</includeonly>#switch: {{<includeonly>safesubst:</includeonly>lc: {{{1|¬}}} }}
|no
|n
|f
|false
|off
|0 = {{{no|<!-- null -->}}}
| = {{{blank|{{{no|<!-- null -->}}}}}}
|¬ = {{{¬|}}}
|yes
|y
|t
|true
|on
|1 = {{{yes|yes}}}
|#default = {{{def|{{{yes|yes}}}}}}
}}<noinclude>
{{Documentation}}
</noinclude>
629c2937bc5cf7cfe13cd2a598582af832782399
Template:Main other
10
104
168
167
2024-03-26T22:42:03Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
{{#switch:
<!--If no or empty "demospace" parameter then detect namespace-->
{{#if:{{{demospace|}}}
| {{lc: {{{demospace}}} }} <!--Use lower case "demospace"-->
| {{#ifeq:{{NAMESPACE}}|{{ns:0}}
| main
| other
}}
}}
| main = {{{1|}}}
| other
| #default = {{{2|}}}
}}<noinclude>
{{documentation}}
<!-- Add categories to the /doc subpage; interwikis go to Wikidata, thank you! -->
</noinclude>
86ad907ffeea3cc545159e00cd1f2d6433946450
Module:Check for unknown parameters
828
105
170
169
2024-03-26T22:42:04Z
Vicht
1
1 revision imported
Scribunto
text/plain
-- This module may be used to compare the arguments passed to the parent
-- with a list of arguments, returning a specified result if an argument is
-- not on the list
local p = {}
local function trim(s)
return s:match('^%s*(.-)%s*$')
end
local function isnotempty(s)
return s and s:match('%S')
end
local function clean(text)
-- Return text cleaned for display and truncated if too long.
-- Strip markers are replaced with dummy text representing the original wikitext.
local pos, truncated
local function truncate(text)
if truncated then
return ''
end
if mw.ustring.len(text) > 25 then
truncated = true
text = mw.ustring.sub(text, 1, 25) .. '...'
end
return mw.text.nowiki(text)
end
local parts = {}
for before, tag, remainder in text:gmatch('([^\127]*)\127[^\127]*%-(%l+)%-[^\127]*\127()') do
pos = remainder
table.insert(parts, truncate(before) .. '<' .. tag .. '>...</' .. tag .. '>')
end
table.insert(parts, truncate(text:sub(pos or 1)))
return table.concat(parts)
end
function p._check(args, pargs)
if type(args) ~= "table" or type(pargs) ~= "table" then
-- TODO: error handling
return
end
-- create the list of known args, regular expressions, and the return string
local knownargs = {}
local regexps = {}
for k, v in pairs(args) do
if type(k) == 'number' then
v = trim(v)
knownargs[v] = 1
elseif k:find('^regexp[1-9][0-9]*$') then
table.insert(regexps, '^' .. v .. '$')
end
end
-- loop over the parent args, and make sure they are on the list
local ignoreblank = isnotempty(args['ignoreblank'])
local showblankpos = isnotempty(args['showblankpositional'])
local values = {}
for k, v in pairs(pargs) do
if type(k) == 'string' and knownargs[k] == nil then
local knownflag = false
for _, regexp in ipairs(regexps) do
if mw.ustring.match(k, regexp) then
knownflag = true
break
end
end
if not knownflag and ( not ignoreblank or isnotempty(v) ) then
table.insert(values, clean(k))
end
elseif type(k) == 'number' and knownargs[tostring(k)] == nil then
local knownflag = false
for _, regexp in ipairs(regexps) do
if mw.ustring.match(tostring(k), regexp) then
knownflag = true
break
end
end
if not knownflag and ( showblankpos or isnotempty(v) ) then
table.insert(values, k .. ' = ' .. clean(v))
end
end
end
-- add results to the output tables
local res = {}
if #values > 0 then
local unknown_text = args['unknown'] or 'Found _VALUE_, '
if mw.getCurrentFrame():preprocess( "{{REVISIONID}}" ) == "" then
local preview_text = args['preview']
if isnotempty(preview_text) then
preview_text = require('Module:If preview')._warning({preview_text})
elseif preview == nil then
preview_text = unknown_text
end
unknown_text = preview_text
end
for _, v in pairs(values) do
-- Fix odd bug for | = which gets stripped to the empty string and
-- breaks category links
if v == '' then v = ' ' end
-- avoid error with v = 'example%2' ("invalid capture index")
local r = unknown_text:gsub('_VALUE_', {_VALUE_ = v})
table.insert(res, r)
end
end
return table.concat(res)
end
function p.check(frame)
local args = frame.args
local pargs = frame:getParent().args
return p._check(args, pargs)
end
return p
93db6d115d4328d2a5148bb42959105e367b663e
Template:Spaces
10
106
172
171
2024-03-26T22:42:04Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
<span class="nowrap">{{#iferror:{{#expr:{{{1|1}}}}}
|{{#switch:{{{1}}}
|fig= 
|en= 
|em= 
|thin= 
|hair= 
|
}}
|{{#invoke:String|rep|{{#switch:{{{2}}}
|fig= 
|en= 
|em= 
|thin= 
|hair= 
|
}}|{{{1|1}}}}}
}}</span><noinclude>
{{documentation}}
</noinclude>
a9ed762825e7579f15dcb9b171b0c1c3bf524b3f
Module:Template link general
828
107
174
173
2024-03-26T22:42:04Z
Vicht
1
1 revision imported
Scribunto
text/plain
-- This implements Template:Tlg
local getArgs = require('Module:Arguments').getArgs
local p = {}
-- Is a string non-empty?
local function _ne(s)
return s ~= nil and s ~= ""
end
local nw = mw.text.nowiki
local function addTemplate(s)
local i, _ = s:find(':', 1, true)
if i == nil then
return 'Template:' .. s
end
local ns = s:sub(1, i - 1)
if ns == '' or mw.site.namespaces[ns] then
return s
else
return 'Template:' .. s
end
end
local function trimTemplate(s)
local needle = 'template:'
if s:sub(1, needle:len()):lower() == needle then
return s:sub(needle:len() + 1)
else
return s
end
end
local function linkTitle(args)
if _ne(args.nolink) then
return args['1']
end
local titleObj
local titlePart = '[['
if args['1'] then
-- This handles :Page and other NS
titleObj = mw.title.new(args['1'], 'Template')
else
titleObj = mw.title.getCurrentTitle()
end
titlePart = titlePart .. (titleObj ~= nil and titleObj.fullText or
addTemplate(args['1']))
local textPart = args.alttext
if not _ne(textPart) then
if titleObj ~= nil then
textPart = titleObj:inNamespace("Template") and args['1'] or titleObj.fullText
else
-- redlink
textPart = args['1']
end
end
if _ne(args.subst) then
-- HACK: the ns thing above is probably broken
textPart = 'subst:' .. textPart
end
if _ne(args.brace) then
textPart = nw('{{') .. textPart .. nw('}}')
elseif _ne(args.braceinside) then
textPart = nw('{') .. textPart .. nw('}')
end
titlePart = titlePart .. '|' .. textPart .. ']]'
if _ne(args.braceinside) then
titlePart = nw('{') .. titlePart .. nw('}')
end
return titlePart
end
function p.main(frame)
local args = getArgs(frame, {
trim = true,
removeBlanks = false
})
return p._main(args)
end
function p._main(args)
local bold = _ne(args.bold) or _ne(args.boldlink) or _ne(args.boldname)
local italic = _ne(args.italic) or _ne(args.italics)
local dontBrace = _ne(args.brace) or _ne(args.braceinside)
local code = _ne(args.code) or _ne(args.tt)
local show_result = _ne(args._show_result)
local expand = _ne(args._expand)
-- Build the link part
local titlePart = linkTitle(args)
if bold then titlePart = "'''" .. titlePart .. "'''" end
if _ne(args.nowrapname) then titlePart = '<span class="nowrap">' .. titlePart .. '</span>' end
-- Build the arguments
local textPart = ""
local textPartBuffer = "|"
local codeArguments = {}
local codeArgumentsString = ""
local i = 2
local j = 1
while args[i] do
local val = args[i]
if val ~= "" then
if _ne(args.nowiki) then
-- Unstrip nowiki tags first because calling nw on something that already contains nowiki tags will
-- mangle the nowiki strip marker and result in literal UNIQ...QINU showing up
val = nw(mw.text.unstripNoWiki(val))
end
local k, v = string.match(val, "(.*)=(.*)")
if not k then
codeArguments[j] = val
j = j + 1
else
codeArguments[k] = v
end
codeArgumentsString = codeArgumentsString .. textPartBuffer .. val
if italic then
val = '<span style="font-style:italic;">' .. val .. '</span>'
end
textPart = textPart .. textPartBuffer .. val
end
i = i + 1
end
-- final wrap
local ret = titlePart .. textPart
if not dontBrace then ret = nw('{{') .. ret .. nw('}}') end
if _ne(args.a) then ret = nw('*') .. ' ' .. ret end
if _ne(args.kbd) then ret = '<kbd>' .. ret .. '</kbd>' end
if code then
ret = '<code>' .. ret .. '</code>'
elseif _ne(args.plaincode) then
ret = '<code style="border:none;background:transparent;">' .. ret .. '</code>'
end
if _ne(args.nowrap) then ret = '<span class="nowrap">' .. ret .. '</span>' end
--[[ Wrap as html??
local span = mw.html.create('span')
span:wikitext(ret)
--]]
if _ne(args.debug) then ret = ret .. '\n<pre>' .. mw.text.encode(mw.dumpObject(args)) .. '</pre>' end
if show_result then
local result = mw.getCurrentFrame():expandTemplate{title = addTemplate(args[1]), args = codeArguments}
ret = ret .. " → " .. result
end
if expand then
local query = mw.text.encode('{{' .. addTemplate(args[1]) .. string.gsub(codeArgumentsString, textPartBuffer, "|") .. '}}')
local url = mw.uri.fullUrl('special:ExpandTemplates', 'wpInput=' .. query)
mw.log()
ret = ret .. " [" .. tostring(url) .. "]"
end
return ret
end
return p
c7307fa3959d308a2dd7fd2f5009c1ce6db3d122
Template:Template other
10
108
176
175
2024-03-26T22:42:04Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
{{#switch:
<!--If no or empty "demospace" parameter then detect namespace-->
{{#if:{{{demospace|}}}
| {{lc: {{{demospace}}} }} <!--Use lower case "demospace"-->
| {{#ifeq:{{NAMESPACE}}|{{ns:Template}}
| template
| other
}}
}}
| template = {{{1|}}}
| other
| #default = {{{2|}}}
}}<!--End switch--><noinclude>
{{documentation}}
<!-- Add categories and interwikis to the /doc subpage, not here! -->
</noinclude>
06fb13d264df967b5232141067eb7d2b67372d76
Template:Clear
10
109
178
177
2024-03-26T22:42:04Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
<div style="clear:{{{1|both}}};" class={{{class|}}}></div><noinclude>
{{documentation}}
</noinclude>
5b24b9fd5cc166a8c486e2422d5df465206ed39c
Template:Main
10
110
180
179
2024-03-26T22:42:04Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
<includeonly>{{#invoke:Labelled list hatnote|labelledList|Main article|Main articles|Main page|Main pages}}</includeonly><noinclude>
{{documentation}}
<!-- Categories go on the /doc subpage, and interwikis go on Wikidata. -->
</noinclude>
99ebf54e265aa9354bc4861d3b0da913f1441ede
Module:Format link
828
111
182
181
2024-03-26T22:42:04Z
Vicht
1
1 revision imported
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Format link
--
-- Makes a wikilink from the given link and display values. Links are escaped
-- with colons if necessary, and links to sections are detected and displayed
-- with " § " as a separator rather than the standard MediaWiki "#". Used in
-- the {{format link}} template.
--------------------------------------------------------------------------------
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg
local mArguments -- lazily initialise [[Module:Arguments]]
local mError -- lazily initialise [[Module:Error]]
local yesno -- lazily initialise [[Module:Yesno]]
local p = {}
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function getArgs(frame)
-- Fetches the arguments from the parent frame. Whitespace is trimmed and
-- blanks are removed.
mArguments = require('Module:Arguments')
return mArguments.getArgs(frame, {parentOnly = true})
end
local function removeInitialColon(s)
-- Removes the initial colon from a string, if present.
return s:match('^:?(.*)')
end
local function maybeItalicize(s, shouldItalicize)
-- Italicize s if s is a string and the shouldItalicize parameter is true.
if s and shouldItalicize then
return '<i>' .. s .. '</i>'
else
return s
end
end
local function parseLink(link)
-- Parse a link and return a table with the link's components.
-- These components are:
-- - link: the link, stripped of any initial colon (always present)
-- - page: the page name (always present)
-- - section: the page name (may be nil)
-- - display: the display text, if manually entered after a pipe (may be nil)
link = removeInitialColon(link)
-- Find whether a faux display value has been added with the {{!}} magic
-- word.
local prePipe, display = link:match('^(.-)|(.*)$')
link = prePipe or link
-- Find the page, if it exists.
-- For links like [[#Bar]], the page will be nil.
local preHash, postHash = link:match('^(.-)#(.*)$')
local page
if not preHash then
-- We have a link like [[Foo]].
page = link
elseif preHash ~= '' then
-- We have a link like [[Foo#Bar]].
page = preHash
end
-- Find the section, if it exists.
local section
if postHash and postHash ~= '' then
section = postHash
end
return {
link = link,
page = page,
section = section,
display = display,
}
end
local function formatDisplay(parsed, options)
-- Formats a display string based on a parsed link table (matching the
-- output of parseLink) and an options table (matching the input options for
-- _formatLink).
local page = maybeItalicize(parsed.page, options.italicizePage)
local section = maybeItalicize(parsed.section, options.italicizeSection)
if (not section) then
return page
elseif (not page) then
return mw.ustring.format('§ %s', section)
else
return mw.ustring.format('%s § %s', page, section)
end
end
local function missingArgError(target)
mError = require('Module:Error')
return mError.error{message =
'Error: no link or target specified! ([[' .. target .. '#Errors|help]])'
}
end
--------------------------------------------------------------------------------
-- Main functions
--------------------------------------------------------------------------------
function p.formatLink(frame)
-- The formatLink export function, for use in templates.
yesno = require('Module:Yesno')
local args = getArgs(frame)
local link = args[1] or args.link
local target = args[3] or args.target
if not (link or target) then
return missingArgError('Template:Format link')
end
return p._formatLink{
link = link,
display = args[2] or args.display,
target = target,
italicizePage = yesno(args.italicizepage),
italicizeSection = yesno(args.italicizesection),
categorizeMissing = args.categorizemissing
}
end
function p._formatLink(options)
-- The formatLink export function, for use in modules.
checkType('_formatLink', 1, options, 'table')
local function check(key, expectedType) --for brevity
checkTypeForNamedArg(
'_formatLink', key, options[key], expectedType or 'string', true
)
end
check('link')
check('display')
check('target')
check('italicizePage', 'boolean')
check('italicizeSection', 'boolean')
check('categorizeMissing')
-- Normalize link and target and check that at least one is present
if options.link == '' then options.link = nil end
if options.target == '' then options.target = nil end
if not (options.link or options.target) then
return missingArgError('Module:Format link')
end
local parsed = parseLink(options.link)
local display = options.display or parsed.display
local catMissing = options.categorizeMissing
local category = ''
-- Find the display text
if not display then display = formatDisplay(parsed, options) end
-- Handle the target option if present
if options.target then
local parsedTarget = parseLink(options.target)
parsed.link = parsedTarget.link
parsed.page = parsedTarget.page
end
-- Test if page exists if a diagnostic category is specified
if catMissing and (mw.ustring.len(catMissing) > 0) then
local title = nil
if parsed.page then title = mw.title.new(parsed.page) end
if title and (not title.isExternal) then
local success, exists = pcall(function() return title.exists end)
if success and not exists then
category = mw.ustring.format('[[Category:%s]]', catMissing)
end
end
end
-- Format the result as a link
if parsed.link == display then
return mw.ustring.format('[[:%s]]%s', parsed.link, category)
else
return mw.ustring.format('[[:%s|%s]]%s', parsed.link, display, category)
end
end
--------------------------------------------------------------------------------
-- Derived convenience functions
--------------------------------------------------------------------------------
function p.formatPages(options, pages)
-- Formats an array of pages using formatLink and the given options table,
-- and returns it as an array. Nil values are not allowed.
local ret = {}
for i, page in ipairs(pages) do
ret[i] = p._formatLink{
link = page,
categorizeMissing = options.categorizeMissing,
italicizePage = options.italicizePage,
italicizeSection = options.italicizeSection
}
end
return ret
end
return p
1253bdd2683ee4badc33856bfd5499b09a7dca1f
Module:Hatnote
828
112
184
183
2024-03-26T22:42:04Z
Vicht
1
1 revision imported
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Module:Hatnote --
-- --
-- This module produces hatnote links and links to related articles. It --
-- implements the {{hatnote}} and {{format link}} meta-templates and includes --
-- helper functions for other Lua hatnote modules. --
--------------------------------------------------------------------------------
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg
local mArguments -- lazily initialise [[Module:Arguments]]
local yesno -- lazily initialise [[Module:Yesno]]
local formatLink -- lazily initialise [[Module:Format link]] ._formatLink
local p = {}
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function getArgs(frame)
-- Fetches the arguments from the parent frame. Whitespace is trimmed and
-- blanks are removed.
mArguments = require('Module:Arguments')
return mArguments.getArgs(frame, {parentOnly = true})
end
local function removeInitialColon(s)
-- Removes the initial colon from a string, if present.
return s:match('^:?(.*)')
end
function p.defaultClasses(inline)
-- Provides the default hatnote classes as a space-separated string; useful
-- for hatnote-manipulation modules like [[Module:Hatnote group]].
return
(inline == 1 and 'hatnote-inline' or 'hatnote') .. ' ' ..
'navigation-not-searchable'
end
function p.disambiguate(page, disambiguator)
-- Formats a page title with a disambiguation parenthetical,
-- i.e. "Example" → "Example (disambiguation)".
checkType('disambiguate', 1, page, 'string')
checkType('disambiguate', 2, disambiguator, 'string', true)
disambiguator = disambiguator or 'disambiguation'
return mw.ustring.format('%s (%s)', page, disambiguator)
end
function p.findNamespaceId(link, removeColon)
-- Finds the namespace id (namespace number) of a link or a pagename. This
-- function will not work if the link is enclosed in double brackets. Colons
-- are trimmed from the start of the link by default. To skip colon
-- trimming, set the removeColon parameter to false.
checkType('findNamespaceId', 1, link, 'string')
checkType('findNamespaceId', 2, removeColon, 'boolean', true)
if removeColon ~= false then
link = removeInitialColon(link)
end
local namespace = link:match('^(.-):')
if namespace then
local nsTable = mw.site.namespaces[namespace]
if nsTable then
return nsTable.id
end
end
return 0
end
function p.makeWikitextError(msg, helpLink, addTrackingCategory, title)
-- Formats an error message to be returned to wikitext. If
-- addTrackingCategory is not false after being returned from
-- [[Module:Yesno]], and if we are not on a talk page, a tracking category
-- is added.
checkType('makeWikitextError', 1, msg, 'string')
checkType('makeWikitextError', 2, helpLink, 'string', true)
yesno = require('Module:Yesno')
title = title or mw.title.getCurrentTitle()
-- Make the help link text.
local helpText
if helpLink then
helpText = ' ([[' .. helpLink .. '|help]])'
else
helpText = ''
end
-- Make the category text.
local category
if not title.isTalkPage -- Don't categorise talk pages
and title.namespace ~= 2 -- Don't categorise userspace
and yesno(addTrackingCategory) ~= false -- Allow opting out
then
category = 'Hatnote templates with errors'
category = mw.ustring.format(
'[[%s:%s]]',
mw.site.namespaces[14].name,
category
)
else
category = ''
end
return mw.ustring.format(
'<strong class="error">Error: %s%s.</strong>%s',
msg,
helpText,
category
)
end
local curNs = mw.title.getCurrentTitle().namespace
p.missingTargetCat =
--Default missing target category, exported for use in related modules
((curNs == 0) or (curNs == 14)) and
'Articles with hatnote templates targeting a nonexistent page' or nil
function p.quote(title)
--Wraps titles in quotation marks. If the title starts/ends with a quotation
--mark, kerns that side as with {{-'}}
local quotationMarks = {
["'"]=true, ['"']=true, ['“']=true, ["‘"]=true, ['”']=true, ["’"]=true
}
local quoteLeft, quoteRight = -- Test if start/end are quotation marks
quotationMarks[string.sub(title, 1, 1)],
quotationMarks[string.sub(title, -1, -1)]
if quoteLeft or quoteRight then
title = mw.html.create("span"):wikitext(title)
end
if quoteLeft then title:css("padding-left", "0.15em") end
if quoteRight then title:css("padding-right", "0.15em") end
return '"' .. tostring(title) .. '"'
end
--------------------------------------------------------------------------------
-- Hatnote
--
-- Produces standard hatnote text. Implements the {{hatnote}} template.
--------------------------------------------------------------------------------
function p.hatnote(frame)
local args = getArgs(frame)
local s = args[1]
if not s then
return p.makeWikitextError(
'no text specified',
'Template:Hatnote#Errors',
args.category
)
end
return p._hatnote(s, {
extraclasses = args.extraclasses,
selfref = args.selfref
})
end
function p._hatnote(s, options)
checkType('_hatnote', 1, s, 'string')
checkType('_hatnote', 2, options, 'table', true)
options = options or {}
local inline = options.inline
local hatnote = mw.html.create(inline == 1 and 'span' or 'div')
local extraclasses
if type(options.extraclasses) == 'string' then
extraclasses = options.extraclasses
end
hatnote
:attr('role', 'note')
:addClass(p.defaultClasses(inline))
:addClass(extraclasses)
:addClass(options.selfref and 'selfref' or nil)
:wikitext(s)
return mw.getCurrentFrame():extensionTag{
name = 'templatestyles', args = { src = 'Module:Hatnote/styles.css' }
} .. tostring(hatnote)
end
return p
3ae1ed7094c5005ca0896395ec9a587287a0bef1
Module:Hatnote/styles.css
828
113
186
185
2024-03-26T22:42:04Z
Vicht
1
1 revision imported
sanitized-css
text/css
/* {{pp|small=y}} */
.hatnote {
font-style: italic;
}
/* Limit structure CSS to divs because of [[Module:Hatnote inline]] */
div.hatnote {
/* @noflip */
padding-left: 1.6em;
margin-bottom: 0.5em;
}
.hatnote i {
font-style: normal;
}
/* The templatestyles element inserts a link element before hatnotes.
* TODO: Remove link if/when WMF resolves T200206 */
.hatnote + link + .hatnote {
margin-top: -0.5em;
}
44680ffd6e888866df2cdfa0341af9c7b97da94c
Module:Hatnote list
828
114
188
187
2024-03-26T22:42:04Z
Vicht
1
1 revision imported
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Module:Hatnote list --
-- --
-- This module produces and formats lists for use in hatnotes. In particular, --
-- it implements the for-see list, i.e. lists of "For X, see Y" statements, --
-- as used in {{about}}, {{redirect}}, and their variants. Also introduced --
-- are andList & orList helpers for formatting lists with those conjunctions. --
--------------------------------------------------------------------------------
local mArguments --initialize lazily
local mFormatLink = require('Module:Format link')
local mHatnote = require('Module:Hatnote')
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local p = {}
--------------------------------------------------------------------------------
-- List stringification helper functions
--
-- These functions are used for stringifying lists, usually page lists inside
-- the "Y" portion of "For X, see Y" for-see items.
--------------------------------------------------------------------------------
--default options table used across the list stringification functions
local stringifyListDefaultOptions = {
conjunction = "and",
separator = ",",
altSeparator = ";",
space = " ",
formatted = false
}
--Searches display text only
local function searchDisp(haystack, needle)
return string.find(
string.sub(haystack, (string.find(haystack, '|') or 0) + 1), needle
)
end
-- Stringifies a list generically; probably shouldn't be used directly
local function stringifyList(list, options)
-- Type-checks, defaults, and a shortcut
checkType("stringifyList", 1, list, "table")
if #list == 0 then return nil end
checkType("stringifyList", 2, options, "table", true)
options = options or {}
for k, v in pairs(stringifyListDefaultOptions) do
if options[k] == nil then options[k] = v end
end
local s = options.space
-- Format the list if requested
if options.formatted then
list = mFormatLink.formatPages(
{categorizeMissing = mHatnote.missingTargetCat}, list
)
end
-- Set the separator; if any item contains it, use the alternate separator
local separator = options.separator
for k, v in pairs(list) do
if searchDisp(v, separator) then
separator = options.altSeparator
break
end
end
-- Set the conjunction, apply Oxford comma, and force a comma if #1 has "§"
local conjunction = s .. options.conjunction .. s
if #list == 2 and searchDisp(list[1], "§") or #list > 2 then
conjunction = separator .. conjunction
end
-- Return the formatted string
return mw.text.listToText(list, separator .. s, conjunction)
end
--DRY function
function p.conjList (conj, list, fmt)
return stringifyList(list, {conjunction = conj, formatted = fmt})
end
-- Stringifies lists with "and" or "or"
function p.andList (...) return p.conjList("and", ...) end
function p.orList (...) return p.conjList("or", ...) end
--------------------------------------------------------------------------------
-- For see
--
-- Makes a "For X, see [[Y]]." list from raw parameters. Intended for the
-- {{about}} and {{redirect}} templates and their variants.
--------------------------------------------------------------------------------
--default options table used across the forSee family of functions
local forSeeDefaultOptions = {
andKeyword = 'and',
title = mw.title.getCurrentTitle().text,
otherText = 'other uses',
forSeeForm = 'For %s, see %s.',
}
--Collapses duplicate punctuation at end of string, ignoring italics and links
local function punctuationCollapse (text)
return text:match("[.?!]('?)%1(%]?)%2%.$") and text:sub(1, -2) or text
end
-- Structures arguments into a table for stringification, & options
function p.forSeeArgsToTable (args, from, options)
-- Type-checks and defaults
checkType("forSeeArgsToTable", 1, args, 'table')
checkType("forSeeArgsToTable", 2, from, 'number', true)
from = from or 1
checkType("forSeeArgsToTable", 3, options, 'table', true)
options = options or {}
for k, v in pairs(forSeeDefaultOptions) do
if options[k] == nil then options[k] = v end
end
-- maxArg's gotten manually because getArgs() and table.maxn aren't friends
local maxArg = 0
for k, v in pairs(args) do
if type(k) == 'number' and k > maxArg then maxArg = k end
end
-- Structure the data out from the parameter list:
-- * forTable is the wrapper table, with forRow rows
-- * Rows are tables of a "use" string & a "pages" table of pagename strings
-- * Blanks are left empty for defaulting elsewhere, but can terminate list
local forTable = {}
local i = from
local terminated = false
-- If there is extra text, and no arguments are given, give nil value
-- to not produce default of "For other uses, see foo (disambiguation)"
if options.extratext and i > maxArg then return nil end
-- Loop to generate rows
repeat
-- New empty row
local forRow = {}
-- On blank use, assume list's ended & break at end of this loop
forRow.use = args[i]
if not args[i] then terminated = true end
-- New empty list of pages
forRow.pages = {}
-- Insert first pages item if present
table.insert(forRow.pages, args[i + 1])
-- If the param after next is "and", do inner loop to collect params
-- until the "and"'s stop. Blanks are ignored: "1|and||and|3" → {1, 3}
while args[i + 2] == options.andKeyword do
if args[i + 3] then
table.insert(forRow.pages, args[i + 3])
end
-- Increment to next "and"
i = i + 2
end
-- Increment to next use
i = i + 2
-- Append the row
table.insert(forTable, forRow)
until terminated or i > maxArg
return forTable
end
-- Stringifies a table as formatted by forSeeArgsToTable
function p.forSeeTableToString (forSeeTable, options)
-- Type-checks and defaults
checkType("forSeeTableToString", 1, forSeeTable, "table", true)
checkType("forSeeTableToString", 2, options, "table", true)
options = options or {}
for k, v in pairs(forSeeDefaultOptions) do
if options[k] == nil then options[k] = v end
end
-- Stringify each for-see item into a list
local strList = {}
if forSeeTable then
for k, v in pairs(forSeeTable) do
local useStr = v.use or options.otherText
local pagesStr =
p.andList(v.pages, true) or
mFormatLink._formatLink{
categorizeMissing = mHatnote.missingTargetCat,
link = mHatnote.disambiguate(options.title)
}
local forSeeStr = string.format(options.forSeeForm, useStr, pagesStr)
forSeeStr = punctuationCollapse(forSeeStr)
table.insert(strList, forSeeStr)
end
end
if options.extratext then table.insert(strList, punctuationCollapse(options.extratext..'.')) end
-- Return the concatenated list
return table.concat(strList, ' ')
end
-- Produces a "For X, see [[Y]]" string from arguments. Expects index gaps
-- but not blank/whitespace values. Ignores named args and args < "from".
function p._forSee (args, from, options)
local forSeeTable = p.forSeeArgsToTable(args, from, options)
return p.forSeeTableToString(forSeeTable, options)
end
-- As _forSee, but uses the frame.
function p.forSee (frame, from, options)
mArguments = require('Module:Arguments')
return p._forSee(mArguments.getArgs(frame), from, options)
end
return p
1c8e6212115f76ecc3db8d05137011cd18207988
Module:Labelled list hatnote
828
115
190
189
2024-03-26T22:42:04Z
Vicht
1
1 revision imported
Scribunto
text/plain
--------------------------------------------------------------------------------
-- Labelled list --
-- --
-- This module does the core work of creating a hatnote composed of a list --
-- prefixed by a colon-terminated label, i.e. "LABEL: [andList of pages]", --
-- for {{see also}} and similar templates. --
--------------------------------------------------------------------------------
local mHatnote = require('Module:Hatnote')
local mHatlist = require('Module:Hatnote list')
local mArguments --initialize lazily
local yesno --initialize lazily
local p = {}
-- Defaults global to this module
local defaults = {
label = 'See also', --Final fallback for label argument
labelForm = '%s: %s',
prefixes = {'label', 'label ', 'l'},
template = 'Module:Labelled list hatnote'
}
-- Localizable message strings
local msg = {
errorSuffix = '#Errors',
noInputWarning = 'no page names specified',
noOutputWarning =
"'''[[%s]] — no output: none of the target pages exist.'''"
}
-- Helper function that pre-combines display parameters into page arguments.
-- Also compresses sparse arrays, as a desirable side-effect.
function p.preprocessDisplays (args, prefixes)
-- Prefixes specify which parameters, in order, to check for display options
-- They each have numbers auto-appended, e.g. 'label1', 'label 1', & 'l1'
prefixes = prefixes or defaults.prefixes
local indices = {}
local sparsePages = {}
for k, v in pairs(args) do
if type(k) == 'number' then
indices[#indices + 1] = k
local display
for i = 1, #prefixes do
display = args[prefixes[i] .. k]
if display then break end
end
sparsePages[k] = display and
string.format('%s|%s', string.gsub(v, '|.*$', ''), display) or v
end
end
table.sort(indices)
local pages = {}
for k, v in ipairs(indices) do pages[#pages + 1] = sparsePages[v] end
return pages
end
--Helper function to get a page target from a processed page string
--e.g. "Page|Label" → "Page" or "Target" → "Target"
local function getTarget(pagename)
local pipe = string.find(pagename, '|')
return string.sub(pagename, 0, pipe and pipe - 1 or nil)
end
-- Produces a labelled pages-list hatnote.
-- The main frame (template definition) takes 1 or 2 arguments, for a singular
-- and (optionally) plural label respectively:
-- * {{#invoke:Labelled list hatnote|labelledList|Singular label|Plural label}}
-- The resulting template takes pagename & label parameters normally.
function p.labelledList (frame)
mArguments = require('Module:Arguments')
yesno = require('Module:Yesno')
local labels = {frame.args[1] or defaults.label}
labels[2] = frame.args[2] or labels[1]
labels[3] = frame.args[3] --no defaulting
labels[4] = frame.args[4] --no defaulting
local template = frame:getParent():getTitle()
local args = mArguments.getArgs(frame, {parentOnly = true})
local pages = p.preprocessDisplays(args)
local options = {
category = yesno(args.category),
extraclasses = frame.args.extraclasses,
ifexists = yesno(frame.args.ifexists),
namespace = frame.args.namespace or args.namespace,
selfref = yesno(frame.args.selfref or args.selfref),
template = template
}
return p._labelledList(pages, labels, options)
end
function p._labelledList (pages, labels, options)
if options.ifexists then
for k = #pages, 1, -1 do --iterate backwards to allow smooth removals
local v = pages[k]
local title = mw.title.new(getTarget(v), namespace)
if (v == '') or title == nil or not title.exists then
table.remove(pages, k)
end
end
end
labels = labels or {}
label = (#pages == 1 and labels[1] or labels[2]) or defaults.label
for k, v in pairs(pages) do
if mHatnote.findNamespaceId(v) ~= 0 then
label =
(
#pages == 1 and
(labels[3] or labels[1] or defaults.label) or
(labels[4] or labels[2] or defaults.label)
) or defaults.label
end
end
if #pages == 0 then
if options.ifexists then
mw.addWarning(
string.format(
msg.noOutputWarning, options.template or defaults.template
)
)
return ''
else
return mHatnote.makeWikitextError(
msg.noInputWarning,
(options.template or defaults.template) .. msg.errorSuffix,
options.category
)
end
end
local text = string.format(
options.labelForm or defaults.labelForm,
label,
mHatlist.andList(pages, true)
)
local hnOptions = {
extraclasses = options.extraclasses,
selfref = options.selfref
}
return mHatnote._hatnote(text, hnOptions)
end
return p
b7a8ba27cf6195e6427701b94e8d2acad3c40a21
Module:Navbar/styles.css
828
116
192
191
2024-03-26T22:42:04Z
Vicht
1
1 revision imported
sanitized-css
text/css
/* {{pp|small=yes}} */
.navbar {
display: inline;
font-size: 88%;
font-weight: normal;
}
.navbar-collapse {
float: left;
text-align: left;
}
.navbar-boxtext {
word-spacing: 0;
}
.navbar ul {
display: inline-block;
white-space: nowrap;
line-height: inherit;
}
.navbar-brackets::before {
margin-right: -0.125em;
content: '[ ';
}
.navbar-brackets::after {
margin-left: -0.125em;
content: ' ]';
}
.navbar li {
word-spacing: -0.125em;
}
.navbar a > span,
.navbar a > abbr {
text-decoration: inherit;
}
.navbar-mini abbr {
font-variant: small-caps;
border-bottom: none;
text-decoration: none;
cursor: inherit;
}
.navbar-ct-full {
font-size: 114%;
margin: 0 7em;
}
.navbar-ct-mini {
font-size: 114%;
margin: 0 4em;
}
9d4056f949b4f0b159e3d40dfb1a5f01e72f9571
Template:Anchor
10
117
194
193
2024-03-26T22:42:04Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
{{<includeonly>safesubst:</includeonly>#invoke:anchor|main}}<noinclude>
{{Documentation}}
<!-- Categories go on the /doc subpage, and interwikis go on Wikidata. -->
</noinclude>
7d65122552007ac959072bddfa6f723296c81998
Template:As of
10
118
196
195
2024-03-26T22:42:05Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
<!--{{As of}} begin--><includeonly><!--
## param 1 is the year
## optional param 2 is the month
## optional param 3 is the day of the month
## optional named parameter alt=[text] is alternative display text (may include wiki markup)
## optional named parameter df=US produces American date format in displayed text
## optional named parameter lc=on gives lower-case-first output
## optional named parameter url=[URL] gives statement reference
## displayed text ([A/a]s of [Start date] by default)
-->{{#if: {{{alt|}}} | {{{alt}}} | {{#if:{{{bare|}}}||{{#if:{{yesno|{{{since|}}}}}|{{#if: {{yesno|{{{lc|}}}}} | s | S }}ince | {{#if: {{yesno|{{{lc|}}}}} | a | A }}s of}}}} {{#if:{{{pre|}}}|{{{pre}}} }}{{#if: {{{3|}}} | {{#ifeq:{{lc:{{{df|}}}}}|us|{{MONTHNAME|{{{2}}}}} {{#expr:{{{3}}}}}, |{{#expr:{{{3}}}}} {{MONTHNAME|{{{2}}}}} }}{{{1}}}|{{#if: {{{2|}}} |{{MONTHNAME|{{{2}}}}} }}{{{1}}}}}}}{{#if:{{{post|}}}|<nowiki />{{{post}}}}}<!--
#### That nowiki is required or, various characters (:, ;, #, and *} will be parsed as wikisyntax for list items.
## ref/update inline banner (hidden by default)
--><sup class="plainlinks noexcerpt noprint asof-tag {{#if:{{{url|}}}|ref|update}}" style="display:none;">[{{#if:{{{url|}}}|{{{url}}} [ref]|{{fullurl:{{PAGENAME}}|action=edit}} [update]}}]</sup><!--
## categorisation disabled outside main namespace
-->{{DMCA|Articles containing potentially dated statements|from|<!--
## temporal category for template (word method)
-->{{#if: {{#ifexpr: {{{1}}} = 1 }} |{{#ifexpr:{{#time:U|{{{1}}}}} > {{#time:U}} | the future | {{#ifexpr: {{#time:Y|{{{1}}}}} > 2004 | {{{1}}} | {{#ifexpr: {{#time:Y|{{{1}}}}} > 1989 | {{#time:Y|{{{1}}}}} | before 1990 }}}}}} |<!--
## temporal category for template (parameter method)
-->{{#ifexpr: {{{1}}} > 2004 | {{#ifexpr:{{#time:U|{{#if:{{{2|}}} | {{MONTHNAME|{{{2}}}}}}} {{{1}}}}} > {{#time:U}} | the future| {{#if:{{{2|}}} | {{MONTHNAME|{{{2}}}}} }} {{{1}}}}} | {{#ifexpr:{{{1}}} > 1989 | {{{1}}} | before 1990 }}}}}}|<!--
## global category for template
-->All articles containing potentially dated statements}}</includeonly><!--{{As of}} end--><noinclude><!--
## dynamic example (as of today, self ref)
-->{{As of|{{CURRENTYEAR}}|{{CURRENTMONTH}}|{{CURRENTDAY}}}}<sup class="plainlinks">[https://en.wikipedia.org/wiki/Template:As_of [ref]]</sup>
{{documentation}}
<!-- Add categories and inter-wikis to the /doc subpage, not here! -->
</noinclude>{{#invoke:Check for unknown parameters|check|unknown={{main other|[[Category:Pages using as of template with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:As of]] with unknown parameter "_VALUE_"|ignoreblank=y| 1 | 2 | 3 | alt | bare | df | lc | post | pre | since | url }}
91770030e512861a99e4376b0513e1b12cc99ff7
Module:Anchor
828
119
198
197
2024-03-26T22:42:05Z
Vicht
1
1 revision imported
Scribunto
text/plain
-- This module implements {{anchor}}.
local getArgs = require('Module:Arguments').getArgs
local tableTools = require('Module:TableTools')
local p = {}
function p.main(frame)
-- Get the positional arguments from #invoke, remove any nil values,
-- and pass them to p._main.
local args = getArgs(frame)
local argArray = tableTools.compressSparseArray(args)
return p._main(unpack(argArray))
end
function p._main(...)
-- Generate the list of anchors.
local anchors = {...}
local ret = {}
for _, anchor in ipairs(anchors) do
ret[#ret + 1] = '<span class="anchor" id="' .. anchor .. '"></span>'
end
return table.concat(ret)
end
return p
e41d3f5d2f2840528aebb9bac719873540fcb3b8
Template:Yesno-no
10
120
200
199
2024-03-26T22:42:05Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
{{safesubst:<noinclude />yesno|{{{1}}}|yes={{{yes|yes}}}|no={{{no|no}}}|blank={{{blank|no}}}|¬={{{¬|no}}}|def={{{def|no}}}}}<noinclude>
{{Documentation|Template:Yesno/doc}}
<!--Categories go in the doc page referenced above; interwikis go in Wikidata.-->
</noinclude>
1ad7b7800da1b867ead8f6ff8cef76e6201b3b56
Template:For
10
121
202
201
2024-03-26T22:42:05Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
<includeonly>{{#invoke:For|For}}</includeonly><noinclude>
{{Documentation}}
</noinclude>
3f70c0fa7cd736071e7c6e7dcd90ff3704df26bb
Module:Color contrast
828
122
204
203
2024-03-26T22:42:08Z
Vicht
1
1 revision imported
Scribunto
text/plain
--
-- This module implements
-- {{Color contrast ratio}}
-- {{Greater color contrast ratio}}
-- {{ColorToLum}}
-- {{RGBColorToLum}}
--
local p = {}
local HTMLcolor = mw.loadData( 'Module:Color contrast/colors' )
local function sRGB (v)
if (v <= 0.03928) then
v = v / 12.92
else
v = math.pow((v+0.055)/1.055, 2.4)
end
return v
end
local function rgbdec2lum(R, G, B)
if ( 0 <= R and R < 256 and 0 <= G and G < 256 and 0 <= B and B < 256 ) then
return 0.2126 * sRGB(R/255) + 0.7152 * sRGB(G/255) + 0.0722 * sRGB(B/255)
else
return ''
end
end
local function hsl2lum(h, s, l)
if ( 0 <= h and h < 360 and 0 <= s and s <= 1 and 0 <= l and l <= 1 ) then
local c = (1 - math.abs(2*l - 1))*s
local x = c*(1 - math.abs( math.fmod(h/60, 2) - 1) )
local m = l - c/2
local r, g, b = m, m, m
if( 0 <= h and h < 60 ) then
r = r + c
g = g + x
elseif( 60 <= h and h < 120 ) then
r = r + x
g = g + c
elseif( 120 <= h and h < 180 ) then
g = g + c
b = b + x
elseif( 180 <= h and h < 240 ) then
g = g + x
b = b + c
elseif( 240 <= h and h < 300 ) then
r = r + x
b = b + c
elseif( 300 <= h and h < 360 ) then
r = r + c
b = b + x
end
return rgbdec2lum(255*r, 255*g, 255*b)
else
return ''
end
end
local function color2lum(c)
if (c == nil) then
return ''
end
-- html '#' entity
c = c:gsub("#", "#")
-- whitespace
c = c:match( '^%s*(.-)[%s;]*$' )
-- unstrip nowiki strip markers
c = mw.text.unstripNoWiki(c)
-- lowercase
c = c:lower()
-- first try to look it up
local L = HTMLcolor[c]
if (L ~= nil) then
return L
end
-- convert from hsl
if mw.ustring.match(c,'^hsl%([%s]*[0-9][0-9%.]*[%s]*,[%s]*[0-9][0-9%.]*%%[%s]*,[%s]*[0-9][0-9%.]*%%[%s]*%)$') then
local h, s, l = mw.ustring.match(c,'^hsl%([%s]*([0-9][0-9%.]*)[%s]*,[%s]*([0-9][0-9%.]*)%%[%s]*,[%s]*([0-9][0-9%.]*)%%[%s]*%)$')
return hsl2lum(tonumber(h), tonumber(s)/100, tonumber(l)/100)
end
-- convert from rgb
if mw.ustring.match(c,'^rgb%([%s]*[0-9][0-9]*[%s]*,[%s]*[0-9][0-9]*[%s]*,[%s]*[0-9][0-9]*[%s]*%)$') then
local R, G, B = mw.ustring.match(c,'^rgb%([%s]*([0-9][0-9]*)[%s]*,[%s]*([0-9][0-9]*)[%s]*,[%s]*([0-9][0-9]*)[%s]*%)$')
return rgbdec2lum(tonumber(R), tonumber(G), tonumber(B))
end
-- convert from rgb percent
if mw.ustring.match(c,'^rgb%([%s]*[0-9][0-9%.]*%%[%s]*,[%s]*[0-9][0-9%.]*%%[%s]*,[%s]*[0-9][0-9%.]*%%[%s]*%)$') then
local R, G, B = mw.ustring.match(c,'^rgb%([%s]*([0-9][0-9%.]*)%%[%s]*,[%s]*([0-9][0-9%.]*)%%[%s]*,[%s]*([0-9][0-9%.]*)%%[%s]*%)$')
return rgbdec2lum(255*tonumber(R)/100, 255*tonumber(G)/100, 255*tonumber(B)/100)
end
-- remove leading # (if there is one) and whitespace
c = mw.ustring.match(c, '^[%s#]*([a-f0-9]*)[%s]*$')
-- split into rgb
local cs = mw.text.split(c or '', '')
if( #cs == 6 ) then
local R = 16*tonumber('0x' .. cs[1]) + tonumber('0x' .. cs[2])
local G = 16*tonumber('0x' .. cs[3]) + tonumber('0x' .. cs[4])
local B = 16*tonumber('0x' .. cs[5]) + tonumber('0x' .. cs[6])
return rgbdec2lum(R, G, B)
elseif ( #cs == 3 ) then
local R = 16*tonumber('0x' .. cs[1]) + tonumber('0x' .. cs[1])
local G = 16*tonumber('0x' .. cs[2]) + tonumber('0x' .. cs[2])
local B = 16*tonumber('0x' .. cs[3]) + tonumber('0x' .. cs[3])
return rgbdec2lum(R, G, B)
end
-- failure, return blank
return ''
end
-- This exports the function for use in other modules.
-- The colour is passed as a string.
function p._lum(color)
return color2lum(color)
end
function p._greatercontrast(args)
local bias = tonumber(args['bias'] or '0') or 0
local css = (args['css'] and args['css'] ~= '') and true or false
local v1 = color2lum(args[1] or '')
local c2 = args[2] or '#FFFFFF'
local v2 = color2lum(c2)
local c3 = args[3] or '#000000'
local v3 = color2lum(c3)
local ratio1 = -1;
local ratio2 = -1;
if (type(v1) == 'number' and type(v2) == 'number') then
ratio1 = (v2 + 0.05)/(v1 + 0.05)
ratio1 = (ratio1 < 1) and 1/ratio1 or ratio1
end
if (type(v1) == 'number' and type(v3) == 'number') then
ratio2 = (v3 + 0.05)/(v1 + 0.05)
ratio2 = (ratio2 < 1) and 1/ratio2 or ratio2
end
if css then
local c1 = args[1] or ''
if mw.ustring.match(c1, '^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$') or
mw.ustring.match(c1, '^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$') then
c1 = '#' .. c1
end
if mw.ustring.match(c2, '^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$') or
mw.ustring.match(c2, '^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$') then
c2 = '#' .. c2
end
if mw.ustring.match(v3, '^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$') or
mw.ustring.match(v3, '^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$') then
c3 = '#' .. c3
end
return 'background-color:' .. c1 .. '; color:' .. ((ratio1 > 0) and (ratio2 > 0) and ((ratio1 + bias > ratio2) and c2 or c3) or '') .. ';'
end
return (ratio1 > 0) and (ratio2 > 0) and ((ratio1 + bias > ratio2) and c2 or c3) or ''
end
function p._ratio(args)
local v1 = color2lum(args[1])
local v2 = color2lum(args[2])
if (type(v1) == 'number' and type(v2) == 'number') then
-- v1 should be the brighter of the two.
if v2 > v1 then
v1, v2 = v2, v1
end
return (v1 + 0.05)/(v2 + 0.05)
else
return args['error'] or '?'
end
end
function p._styleratio(args)
local style = (args[1] or ''):lower()
local bg, fg = 'white', 'black'
local lum_bg, lum_fg = 1, 0
if args[2] then
local lum = color2lum(args[2])
if lum ~= '' then bg, lum_bg = args[2], lum end
end
if args[3] then
local lum = color2lum(args[3])
if lum ~= '' then fg, lum_fg = args[3], lum end
end
local slist = mw.text.split(mw.ustring.gsub(mw.ustring.gsub(style or '', '&#[Xx]23;', '#'), '#', '#'), ';')
for k = 1,#slist do
local s = slist[k]
local k,v = s:match( '^[%s]*([^:]-):([^:]-)[%s;]*$' )
k = k or ''
v = v or ''
if (k:match('^[%s]*(background)[%s]*$') or k:match('^[%s]*(background%-color)[%s]*$')) then
local lum = color2lum(v)
if( lum ~= '' ) then bg, lum_bg = v, lum end
elseif (k:match('^[%s]*(color)[%s]*$')) then
local lum = color2lum(v)
if( lum ~= '' ) then bg, lum_fg = v, lum end
end
end
if lum_bg > lum_fg then
return (lum_bg + 0.05)/(lum_fg + 0.05)
else
return (lum_fg + 0.05)/(lum_bg + 0.05)
end
end
--[[
Use {{#invoke:Color contrast|somecolor}} directly or
{{#invoke:Color contrast}} from a wrapper template.
Parameters:
-- |1= — required; A color to check.
--]]
function p.lum(frame)
local color = frame.args[1] or frame:getParent().args[1]
return p._lum(color)
end
function p.ratio(frame)
local args = frame.args[1] and frame.args or frame:getParent().args
return p._ratio(args)
end
function p.styleratio(frame)
local args = frame.args[1] and frame.args or frame:getParent().args
return p._styleratio(args)
end
function p.greatercontrast(frame)
local args = frame.args[1] and frame.args or frame:getParent().args
return p._greatercontrast(args)
end
return p
1e399769117591366a63f62996c9a407077cc711
Module:Color contrast/colors
828
123
206
205
2024-03-26T22:42:08Z
Vicht
1
1 revision imported
Scribunto
text/plain
return {
aliceblue = 0.92880068253475,
antiquewhite = 0.84646951707754,
aqua = 0.7874,
aquamarine = 0.8078549208338,
azure = 0.97265264954166,
beige = 0.8988459998705,
bisque = 0.80732327372979,
black = 0,
blanchedalmond = 0.85084439608156,
blue = 0.0722,
blueviolet = 0.12622014321946,
brown = 0.098224287876511,
burlywood = 0.51559844533893,
cadetblue = 0.29424681085422,
chartreuse = 0.76032025902623,
chocolate = 0.23898526114557,
coral = 0.37017930872924,
cornflowerblue = 0.30318641994179,
cornsilk = 0.93562110372965,
crimson = 0.16042199953026,
cyan = 0.7874,
darkblue = 0.018640801980939,
darkcyan = 0.20329317839046,
darkgoldenrod = 0.27264703559993,
darkgray = 0.39675523072563,
darkgreen = 0.091143429047575,
darkgrey = 0.39675523072563,
darkkhaki = 0.45747326349994,
darkmagenta = 0.07353047651207,
darkolivegreen = 0.12651920884889,
darkorange = 0.40016167026524,
darkorchid = 0.13413142174857,
darkred = 0.054889674531132,
darksalmon = 0.40541471563381,
darkseagreen = 0.43789249325969,
darkslateblue = 0.065792846227988,
darkslategray = 0.067608151928044,
darkslategrey = 0.067608151928044,
darkturquoise = 0.4874606277449,
darkviolet = 0.10999048339343,
deeppink = 0.23866895828276,
deepskyblue = 0.44481603395575,
dimgray = 0.14126329114027,
dimgrey = 0.14126329114027,
dodgerblue = 0.27442536991456,
firebrick = 0.10724525535015,
floralwhite = 0.95922484825004,
forestgreen = 0.18920812076002,
fuchsia = 0.2848,
gainsboro = 0.71569350050648,
ghostwhite = 0.94311261886323,
gold = 0.69860877428159,
goldenrod = 0.41919977809569,
gray = 0.2158605001139,
green = 0.15438342968146,
greenyellow = 0.80609472611453,
grey = 0.2158605001139,
honeydew = 0.96336535554782,
hotpink = 0.34658438169715,
indianred = 0.21406134963884,
indigo = 0.03107561486337,
ivory = 0.99071270600615,
khaki = 0.77012343394121,
lavender = 0.80318750514521,
lavenderblush = 0.90172748631046,
lawngreen = 0.73905893124963,
lemonchiffon = 0.94038992245622,
lightblue = 0.63709141280807,
lightcoral = 0.35522120733135,
lightcyan = 0.94587293494829,
lightgoldenrodyellow = 0.93348351018297,
lightgray = 0.65140563741982,
lightgreen = 0.69091979956865,
lightgrey = 0.65140563741982,
lightpink = 0.58566152734898,
lightsalmon = 0.4780675225206,
lightseagreen = 0.35050145117042,
lightskyblue = 0.56195637618331,
lightslategray = 0.23830165007287,
lightslategrey = 0.23830165007287,
lightsteelblue = 0.53983888284666,
lightyellow = 0.98161818392882,
lime = 0.7152,
limegreen = 0.44571042246098,
linen = 0.88357340984379,
magenta = 0.2848,
maroon = 0.045891942324215,
mediumaquamarine = 0.49389703310801,
mediumblue = 0.044077780212328,
mediumorchid = 0.21639251153773,
mediumpurple = 0.22905858091648,
mediumseagreen = 0.34393112338131,
mediumslateblue = 0.20284629471622,
mediumspringgreen = 0.70704308194184,
mediumturquoise = 0.5133827926448,
mediumvioletred = 0.14371899849357,
midnightblue = 0.02071786635086,
mintcream = 0.97834604947588,
mistyrose = 0.82183047859185,
moccasin = 0.80083000991567,
navajowhite = 0.76519682342785,
navy = 0.015585128108224,
oldlace = 0.91900633405549,
olive = 0.20027537200568,
olivedrab = 0.22593150951929,
orange = 0.4817026703631,
orangered = 0.25516243753416,
orchid = 0.31348806761439,
palegoldenrod = 0.78792647887614,
palegreen = 0.77936759006353,
paleturquoise = 0.76436077921714,
palevioletred = 0.28754994117889,
papayawhip = 0.87797100199835,
peachpuff = 0.74905589878251,
peru = 0.30113074877936,
pink = 0.63271070702466,
plum = 0.45734221587969,
powderblue = 0.68254586500605,
purple = 0.061477070432439,
rebeccapurple = 0.07492341159447,
red = 0.2126,
rosybrown = 0.32319457649407,
royalblue = 0.16663210743188,
saddlebrown = 0.097922285020521,
salmon = 0.36977241527596,
sandybrown = 0.46628543696283,
seagreen = 0.19734199706275,
seashell = 0.92737862206922,
sienna = 0.13697631337098,
silver = 0.52711512570581,
skyblue = 0.55291668518184,
slateblue = 0.14784278062136,
slategray = 0.20896704076536,
slategrey = 0.20896704076536,
snow = 0.96533341834849,
springgreen = 0.73052306068529,
steelblue = 0.20562642207625,
tan = 0.48237604163921,
teal = 0.16996855778968,
thistle = 0.56818401093733,
tomato = 0.30638612719415,
turquoise = 0.5895536427578,
violet = 0.40315452986676,
wheat = 0.74909702820482,
white = 1,
whitesmoke = 0.91309865179342,
yellow = 0.9278,
yellowgreen = 0.50762957208707,
}
6ae47fdb24de4eed5ec26d203faf5341a388987b
Module:For
828
124
208
207
2024-03-26T22:42:08Z
Vicht
1
1 revision imported
Scribunto
text/plain
local mArguments --initialize lazily
local mHatlist = require('Module:Hatnote list')
local mHatnote = require('Module:Hatnote')
local yesNo = require('Module:Yesno')
local p = {}
--Implements {{For}} from the frame
--uses capitalized "For" to avoid collision with Lua reserved word "for"
function p.For (frame)
mArguments = require('Module:Arguments')
return p._For(mArguments.getArgs(frame))
end
--Implements {{For}} but takes a manual arguments table
function p._For (args)
local use = args[1]
if (not use) then
return mHatnote.makeWikitextError(
'no context parameter provided. Use {{other uses}} for "other uses" hatnotes.',
'Template:For#Errors',
args.category
)
end
local pages = {}
function two (a, b) return a, b, 1 end --lets us run ipairs from 2
for k, v in two(ipairs(args)) do table.insert(pages, v) end
local title = mw.title.getCurrentTitle()
local skipCat = title.isTalkPage or title.namespace == 2 --don't categorise talk pages and userspace
local oddCat = skipCat and '' or '[[Category:Hatnote templates using unusual parameters]]'
local category = yesNo(args.category)
return mHatnote._hatnote(
mHatlist.forSeeTableToString({{use = use, pages = pages}}),
{selfref = args.selfref}
) .. (
(use == 'other uses') and ((category == true) or (category == nil)) and
oddCat or ''
)
end
return p
2faf1bd8c657f3425af829cbde9733a936d8d4f4
Template:Para
10
125
210
209
2024-03-26T22:42:08Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
<code class="tpl-para" style="word-break:break-word;{{SAFESUBST:<noinclude />#if:{{{plain|}}}|border: none; background-color: inherit;}} {{SAFESUBST:<noinclude />#if:{{{plain|}}}{{{mxt|}}}{{{green|}}}{{{!mxt|}}}{{{red|}}}|color: {{SAFESUBST:<noinclude />#if:{{{mxt|}}}{{{green|}}}|#006400|{{SAFESUBST:<noinclude />#if:{{{!mxt|}}}{{{red|}}}|#8B0000|inherit}}}};}} {{SAFESUBST:<noinclude />#if:{{{style|}}}|{{{style}}}}}">|{{SAFESUBST:<noinclude />#if:{{{1|}}}|{{{1}}}=}}{{{2|}}}</code><noinclude>
{{Documentation}}
<!--Categories and interwikis go near the bottom of the /doc subpage.-->
</noinclude>
06006deea2ed5d552aab61b4332321ab749ae7e8
Template:Navbar
10
126
212
211
2024-03-26T22:42:08Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
<includeonly>{{#invoke:Navbar|navbar}}</includeonly><noinclude>
{{documentation}}
</noinclude>
868e3566b7e8a9a5a7f3dac75cac429c47de10d3
Template:Hatnote
10
127
214
213
2024-03-26T22:42:08Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
<includeonly>{{#invoke:Hatnote|hatnote}}</includeonly><noinclude>
{{documentation}}
<!-- Categories go on the /doc subpage, and interwikis go on Wikidata. -->
</noinclude>
4a1d1028d07c9056022807a96051e1c82cf2a1c7
Template:Documentation
10
128
216
215
2024-03-26T22:42:08Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
{{#invoke:documentation|main|_content={{ {{#invoke:documentation|contentTitle}}}}}}<noinclude>
<!-- Add categories to the /doc subpage -->
</noinclude>
9e62b964e96c4e3d478edecbfcb3c0338ae8a276
Template:Oldid
10
129
218
217
2024-03-26T22:42:08Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
<span class="plainlinks">[{{fullurl:{{{page|{{{1|Main Page}}}}}}|oldid={{{oldid|{{{2|}}}}}}}} {{{label|{{{title|{{{3|{{#if:{{{oldid|{{{2|}}}}}}|Old revision|Current version}} of {{#if:{{{page|{{{1|}}}}}}|'''{{{page|{{{1}}}}}}'''|a page}}}}}}}}}}}]</span><noinclude>
{{documentation}}
</noinclude>
4a42ae0cc77ec0385d4b6508c5d3f366db39ecdb
Template:Tag
10
130
220
219
2024-03-26T22:42:09Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
<code class="{{#ifeq:{{{wrap|}}}|yes|wrap|nowrap}}" style="{{#ifeq:{{{style|}}}|plain|border:none;background:transparent;|{{{style|}}}}}"><!--
Opening tag
-->{{#switch:{{{2|pair}}}
|c|close =
|e|empty|s|single|v|void
|o|open
|p|pair = <{{#if:{{{link|}}}|[[HTML element#{{{1|tag}}}|{{{1|tag}}}]]|{{{1|tag}}}}}{{#if:{{{params|{{{attribs|}}}}}}| {{{params|{{{attribs}}}}}}}}
}}<!--
Content between tags
-->{{#switch:{{{2|pair}}}
|c|close = {{{content|}}}
|e|empty|s|single|v|void =  />
|o|open = >{{{content|}}}
|p|pair = {{#ifeq:{{{1|tag}}}|!--||>}}{{{content|...}}}
}}<!--
Closing tag
-->{{#switch:{{{2|pair}}}
|e|empty|s|single|v|void
|o|open =
|c|close
|p|pair = {{#ifeq:{{{1|tag}}}|!--|-->|</{{{1|tag}}}>}}
}}<!--
--></code><noinclude>
{{Documentation}}
</noinclude>
eae208bc1612c834de697fa3ee9b343966cf8602
Template:Documentation subpage
10
131
222
221
2024-03-26T22:42:09Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
<includeonly><!--
-->{{#ifeq:{{lc:{{SUBPAGENAME}}}} |{{{override|doc}}}
| <!--(this template has been transcluded on a /doc or /{{{override}}} page)-->
</includeonly><!--
-->{{#ifeq:{{{doc-notice|show}}} |show
| {{Mbox
| type = notice
| style = margin-bottom:1.0em;
| image = [[File:Edit-copy green.svg|40px|alt=|link=]]
| text =
{{strong|This is a [[Wikipedia:Template documentation|documentation]] [[Wikipedia:Subpages|subpage]]}} for {{terminate sentence|{{{1|[[:{{SUBJECTSPACE}}:{{BASEPAGENAME}}]]}}}}}<br />It may contain usage information, [[Wikipedia:Categorization|categories]] and other content that is not part of the original {{#if:{{{text2|}}} |{{{text2}}} |{{#if:{{{text1|}}} |{{{text1}}} |{{#ifeq:{{SUBJECTSPACE}} |{{ns:User}} |{{lc:{{SUBJECTSPACE}}}} template page |{{#if:{{SUBJECTSPACE}} |{{lc:{{SUBJECTSPACE}}}} page|article}}}}}}}}.
}}
}}<!--
-->{{DEFAULTSORT:{{{defaultsort|{{PAGENAME}}}}}}}<!--
-->{{#if:{{{inhibit|}}} |<!--(don't categorize)-->
| <includeonly><!--
-->{{#ifexist:{{NAMESPACE}}:{{BASEPAGENAME}}
| [[Category:{{#switch:{{SUBJECTSPACE}} |Template=Template |Module=Module |User=User |#default=Wikipedia}} documentation pages]]
| [[Category:Documentation subpages without corresponding pages]]
}}<!--
--></includeonly>
}}<!--
(completing initial #ifeq: at start of template:)
--><includeonly>
| <!--(this template has not been transcluded on a /doc or /{{{override}}} page)-->
}}<!--
--></includeonly><noinclude>{{Documentation}}</noinclude>
41ca90af0945442788a2dbd08c8c54a61a23c057
Template:Template link with link off
10
132
224
223
2024-03-26T22:42:09Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
<includeonly>{{#Invoke:Template link general|main|nowrap=yes|nolink=yes}}</includeonly><noinclude>
{{Documentation|1=Template:Tlg/doc
|content = {{tlg/doc|tlf}}
}}
<!-- Add categories to the /doc subpage, not here! -->
</noinclude>
b099fea5d1f36b0b4b9cb253ad3a9f4e095f6851
Template:Tlf
10
133
226
225
2024-03-26T22:42:09Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
#REDIRECT [[Template:Template link with link off]]
{{Redirect category shell|
{{R from move}}
}}
52759e1d3f7c9aa4a03d0b7d4f84f4c6adf53edf
Template:Selfref
10
134
228
227
2024-03-26T22:42:09Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
#REDIRECT [[Template:Self-reference]]
{{Redirect category shell|
{{R from template shortcut}}
{{R from alternative spelling}}
{{R from move}}
}}
030c372ed4f83fa2e03a4c0ccdd4ad3cef8ec9e6
Template:FULLBASEPAGENAME
10
135
230
229
2024-03-26T22:42:09Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
{{#if: {{Ns has subpages | {{#if:{{{1|}}}|{{NAMESPACE:{{{1}}}}}|{{NAMESPACE}}}} }}
| {{#if: {{#titleparts:{{#if:{{{1|}}}|{{{1}}}|{{FULLPAGENAME}}}}|-1}}
| {{#titleparts:{{#if:{{{1|}}}|{{{1}}}|{{FULLPAGENAME}}}}|-1}}
| {{#if:{{{1|}}}|{{{1}}}|{{FULLPAGENAME}}}}
}}
| {{#if:{{{1|}}}|{{{1}}}|{{FULLPAGENAME}}}}
}}<noinclude>
{{documentation}}
</noinclude>
a21f32ffc20eab6d41631b3fb8af4c63e153a6c3
Template:TemplateData header
10
136
232
231
2024-03-26T22:42:09Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
<div class="templatedata-header">{{#if:{{{noheader|}}}|<!--
noheader:
-->{{Template parameter usage|{{{1|{{BASEPAGENAME}}}}}|based=y}}|<!--
+header:
-->This is the {{#if:{{{nolink|}}}|<!--
+header, nolink TD
-->TemplateData|<!--
+header, +link [[TD]]; DEFAULT:
-->[[Wikipedia:TemplateData|TemplateData]]}}<!--
e.o. #if:nolink; DEFAULT:
--> for this template used by [[mw:Extension:TemplateWizard|TemplateWizard]], [[Wikipedia:VisualEditor|VisualEditor]] and other tools. {{Template parameter usage|{{{1|{{BASEPAGENAME}}}}}|based=y}}<!--
e.o. #if:noheader
-->}}
'''TemplateData for {{{1|{{BASEPAGENAME}}}}}'''
</div><includeonly><!--
check parameters
-->{{#invoke:Check for unknown parameters|check
|unknown={{template other|1=[[Category:Pages using TemplateData header with unknown parameters|_VALUE_]]}}
|template=Template:TemplateData header
|1 |nolink |noheader
|preview=<div class="error" style="font-weight:normal">Unknown parameter '_VALUE_' in [[Template:TemplateData header]].</div>
}}<!--
-->{{template other|{{sandbox other||
[[Category:Templates using TemplateData]]
}}}}</includeonly><!--
--><noinclude>{{Documentation}}</noinclude>
748b89c815a11e78b365c5617460ea569f3f96cb
Template:Template parameter usage
10
137
234
233
2024-03-26T22:42:09Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
{{#switch:{{{label|}}}
|=[https://bambots.brucemyers.com/TemplateParam.php?wiki=enwiki&template={{Urlencode:{{#if:{{{1|}}}|{{ROOTPAGENAME:{{{1|}}}}}|{{ROOTPAGENAME}}}}}} {{#ifeq:{{yesno-no|{{{lc}}}}}|no|S|s}}ee a monthly parameter usage report] for {{#if:{{{1|}}}|[[Template:{{ROOTPAGENAME:{{{1|}}}}}]]|this template}} in articles{{#ifeq:{{yesno-no|{{{based}}}}}|yes| based on {{#if:{{{1|}}}|its|this}} TemplateData}}.
|None|none=[https://bambots.brucemyers.com/TemplateParam.php?wiki=enwiki&template={{Urlencode:{{#if:{{{1|}}}|{{ROOTPAGENAME:{{{1|}}}}}|{{ROOTPAGENAME}}}}}} {{#ifeq:{{yesno-no|{{{lc}}}}}|no|P|p}}arameter usage report]{{#ifeq:{{yesno-no|{{{based}}}}}|yes| based on {{#if:{{{1|}}}|its|this}} TemplateData}}
|for|For=[https://bambots.brucemyers.com/TemplateParam.php?wiki=enwiki&template={{Urlencode:{{#if:{{{1|}}}|{{ROOTPAGENAME:{{{1|}}}}}|{{ROOTPAGENAME}}}}}} {{#ifeq:{{yesno-no|{{{lc}}}}}|no|P|p}}arameter usage report] for {{#if:{{{1|}}}|[[Template:{{ROOTPAGENAME:{{{1|}}}}}]]|[[Template:{{ROOTPAGENAME}}]]}}{{#ifeq:{{yesno-no|{{{based}}}}}|yes| based on {{#if:{{{1|}}}|its|this}} TemplateData}}.
|#default=[https://bambots.brucemyers.com/TemplateParam.php?wiki=enwiki&template={{Urlencode:{{#if:{{{1|}}}|{{ROOTPAGENAME:{{{1|}}}}}|{{ROOTPAGENAME}}}}}} {{{label|}}}]{{#ifeq:{{yesno-no|{{{based}}}}}|yes| based on {{#if:{{{1|}}}|its|this}} TemplateData}}
}}<noinclude>
{{documentation}}
</noinclude>
83e574f5e031df639a2cdcef5b91d6b1094ae648
Template:Self-reference
10
138
236
235
2024-03-26T22:42:09Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
{{#switch:{{{2|NONE}}}
|NONE|hatnote|hat={{Hatnote|extraclasses=plainlinks selfreference noprint|1={{{1}}}}}
|inline=<div class="plainlinks selfreference" style="display:inline; font-style: italic;"><!--Same style as class hatnote.-->{{{1}}}</div>
|<!--Matching the empty string here for unprintworthy content is for backwards compatibility with the 2006-2008 version. Do not depend on it!-->=<div style="display:inline;" class="plainlinks selfreference noprint">{{{1}}}</div>
|#default={{error|Second parameter must be <code>hatnote</code>, <code>hat</code>, or <code>inline</code>}}
}}<noinclude>
{{Documentation}}
<!-- PLEASE ADD THIS TEMPLATE'S CATEGORIES THE /doc SUBPAGE, AND INTERWIKIS TO WIKIDATA, THANKS -->
</noinclude>
0c4a08f880070e918c3edcaa50cc493f99841e98
Template:TemplateDataHeader
10
139
238
237
2024-03-26T22:42:09Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
#REDIRECT [[Template:TemplateData header]]
{{R from move}}
61e461016bcb3a0a6fc4d8aea35d590298c19630
Template:Template display
10
140
240
239
2024-03-26T22:42:09Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
<includeonly>{{#invoke:Message box|ombox|type=notice
|image={{#switch:{{{1}}}|adaptive=[[File:Different devices simple.svg|65x65px|link=|alt=]]|nomobile=[[File:Handheld devices no.svg|55px|link=|alt=]]|nodesktop=[[File:Desktop devices no.svg|55px|link=|alt=]]}}
|text={{#switch:{{{1}}}
| adaptive = This template is [[Adaptive web design|responsive]] and <strong>displays differently in mobile and desktop view</strong>. Read the documentation for an explanation of the differences and why they exist.
| nomobile = This template does ''not'' display in the mobile view of Wikipedia; it is <strong>desktop only</strong>. Read the documentation for an explanation.
| nomobile720 = This template does ''not'' display in the mobile view of Wikipedia when the window is less than 720 pixels wide. Read the documentation for an explanation.
| nodesktop = This template does ''not'' display in the desktop view of Wikipedia; it is <strong>mobile only</strong>. Read the documentation for an explanation.
| nomobilesidebar = This template does ''not'' display in the mobile view of Wikipedia; it is <strong>desktop only</strong>. Read the [[Template:Sidebar/doc|parent documentation]] for an explanation.
| badmobile = This template contains coding that is not compatible with [[Help:Mobile access|mobile versions of Wikipedia]], causing display and [[Wikipedia:Manual of Style/Accessibility|accessibility problems]]. Read the documentation for an explanation.
| vector2022 = This template does not work properly in the [[Wikipedia:Vector 2022|Vector 2022]] skin. Read the documentation for an explanation.
| #default = {{{1}}}
}}}}</includeonly><noinclude>
{{Documentation}}
</noinclude>
52fab071b5e33fcc6478fd3139f558ad1e95c985
Template:Navbox suite
10
141
242
241
2024-03-26T22:42:10Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
{{#invoke:sidebar|sidebar
| width = auto
| bodystyle = border-spacing:0;background:#f7f7f7;padding:2px;
| title = Navbox suite
| titlestyle = padding: 0.2em 0.8em; font-size: 145%; line-height: 1.2em; background-color: #ccf;
| contentclass = plainlist
| contentstyle = padding:0.25em;background:#fdfdfd;
| content1 =
*{{tl|Navbox}}
*{{tl|Navbox with collapsible groups}}
*{{tl|Navbox with columns}}
*{{tl|Navboxes}}
| navbarstyle = background:#fdfdfd;padding:0 5px
}}<!--
NOTE: A template MUST support all of the parameters marked with a cross in Template:Navbox/doc in order to be Navbox suite compliant.
In particular, the name, state, border, and navbar parameters are especially important.
--><noinclude>
{{Documentation|content=
Helper template for linking between main navbox templates in their documentation.
[[Category:Wikipedia-internal sidebar templates]]
[[Category:Navbox meta-templates|Δ]]<!-- Δ for documentation ([[WP:SORTKEY]]) -->
[[Category:Documentation see also templates]]
}}
</noinclude>
1c4315eaad3857aa3fcc7a7bb9d24c989e20e19f
Template:Navbox visibility
10
142
244
243
2024-03-26T22:42:10Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
Templates using the classes <code>class=navbox</code> ({{tl|navbox}}) or <code>class=nomobile</code> ({{tl|sidebar}}) are not displayed on the [https://en.m.wikipedia.org/ mobile web site] of English Wikipedia. Mobile page views account for approximately 66% of all page views (90-day average {{as of|January 2024|lc=y}}).<noinclude>
{{documentation}}
</noinclude>
4e8393af2aa8c53adad3fa90c687120d5726d026
Template:PAGENAMETDOC
10
143
246
245
2024-03-26T22:42:10Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
{{#ifeq:{{#invoke:String|find|{{FULLPAGENAME}}|/sandbox%d*$|plain=false}}|0|{{{{#if:{{{1|}}}||FULL}}BASEPAGENAME}}|{{{{#if:{{{1|}}}||FULL}}PAGENAME}}}}<noinclude>
{{Documentation|content=
This template returns the current {{Tlx|FULLBASEPAGENAME}}, unless the title ends in <code>/sandbox</code> plus any number of digits, in which case it returns the {{tlx|FULLPAGENAME}}. It is primarily meant for demonstrating the sandbox version of templates in their documentation.
This template takes one numbered parameter (<code>1</code>); if anything is in this parameter then it will return <code>{{BASEPAGENAME}}</code> and <code>{{PAGENAME}}</code>, which have no namespace prefix.
}}
[[Category:Wikipedia magic word templates]]
</noinclude>
ae0c3ac1a7415671c46f970d5faad2fd708640b0
Template:Navigation templates
10
144
248
247
2024-03-26T22:42:10Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
<templatestyles src="Module:Navbox/styles.css" />
{| class="wikitable" style="margin-left: auto; margin-right: auto; text-align: center;"
|+ Navigation templates comparison {{Navbar|Navigation templates|plain=1|brackets=y}}
|-
! Template
! Collapsible !! Header color
! Image !! Groups !! Style (body) <br /> parameter/s
|-
| style="text-align: left;" | {{tl|Navbox}}
| collapsible || class="navbox-title" | navbox
| Left/right of body || Yes || Yes
|-
| style="text-align: left;" | {{tl|Navbox with collapsible groups}}
| collapsible || class="navbox-title" | navbox
| Left/right of body and/or in each list || Yes || Yes
|-
| style="text-align: left;" | {{tl|Navbox with columns}}
| collapsible || class="navbox-title" | navbox
| Left/right of columns || No || Yes
|}
{| class="wikitable" style="margin-left: auto; margin-right: auto; text-align: center;"
|+ Collapsible attributes
|-
! Type !! CSS classes !! JavaScript !! Collapses when !! Custom <br /> initial state !! Nesting
|-
| style="text-align:left;" | [[Help:Collapsing|Collapsible tables]]
| mw-collapsible
| Defined in [[MediaWiki:Common.js|Common.js]]
| 2 or more autocollapse on page || Yes || Yes
|}<noinclude>
[[Category:Navbox meta-templates|Δ]]
[[Category:Documentation shared content templates]]
</noinclude>
3532432c7f57704faf211932139c393f1bc2b912
Template:Navbox/doc
10
145
250
249
2024-03-26T22:42:11Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
{{for|vertically-aligned navigation|Template:Sidebar}}
{{documentation subpage}}
{{high use}}
{{Template display|nomobile}}
{{Lua|Module:Navbox}}
{{Navbox suite}}
{{Lua sidebar}}
This template allows a [[Wikipedia:Navigation template|navigational template]] to be set up relatively quickly by supplying it with one or more lists of links. It comes equipped with default styles that should work for most navigational templates. Changing the default styles is possible, but not recommended. Using this template, or one of its "Navbox suite" sister templates, is highly recommended for standardization of navigational templates, and for ease of use.
{{Navbox visibility}}
== Usage ==
Please remove the parameters that are left blank.
<syntaxhighlight lang="wikitext" style="overflow: auto;">{{Navbox
| name = {{subst:PAGENAME}}{{subst:void|Don't change anything on this line. It will change itself when you save.}}
| title =
| listclass = hlist
| state = {{{state|}}}
| above =
| image =
| group1 =
| list1 =
| group2 =
| list2 =
| group3 =
| list3 =
<!-- ... -->
| below =
}}
</syntaxhighlight>
== Parameter list ==
{{{{PAGENAMETDOC}}
| name = Navbox/doc
| state = uncollapsed
| title = {{{title}}}
| above = {{{above}}}
| image = {{{image}}}
| group1 = {{{group1}}}
| list1 = {{{list1}}}
| group2 = {{{group2}}}
| list2 = {{{list2}}}
| group3 = {{{group3}}}
| list3 = {{{list3}}}
| group4 = {{{group4}}}
| list4 = {{{list4}}}
| below = {{{below}}} <br /> See alternate navbox formats under: [[#Layout of table|''Layout of table'']]
}}
The navbox uses lowercase parameter names, as shown in the box (''above''). The required ''name'' and ''title'' will create a one-line box if other parameters are omitted.
Notice "group1" (etc.) is optional, as are sections named "above/below".
{{clear}}
The basic and most common parameters are as follows (see [[#Parameter descriptions|below]] for the full list):
: <code>name</code> – the name (Wikipedia location) of the template.
: <code>title</code> – text in the title bar, such as: <nowiki>[[Widget stuff]]</nowiki>.
: <code>listclass</code> – a CSS class for the list cells, usually <code>hlist</code> for horizontal lists. Alternatively, use bodyclass for the whole box.
: <code>state</code> – controls when a navbox is expanded or collapsed.
: <code>titlestyle</code> – a CSS style for the title-bar, such as: <code>background: gray;</code>
: <code>groupstyle</code> – a CSS style for the group-cells, such as: <code>background: #eee;</code>
: <code>above</code> – text to appear above the group/list section (could be a list of overall wikilinks).
: <code>image</code> – an optional right-side image, coded as the whole image, such as: <code><nowiki>[[File:</nowiki><var>XX</var><nowiki>.jpg|80px|link=|alt=]]</nowiki></code>
:: Note that most of such images don't comply with [[MOS:DECOR]] and should be removed at sight.
: <code>imageleft</code> – an optional left-side image (code the same as the "image" parameter).
: <code>group<sub>n</sub></code> – the left-side text before list-n (if group-n omitted, list-n extends to the left edge of the box, and defaults to <code>text-align:center</code> styling).
: <code>list<sub>n</sub></code> – text listing wikilinks using a [[Help:List|wikilist]] format.
: <code>below</code> – optional text to appear below the group/list section.
== Parameter descriptions ==
The following is a complete list of parameters for using {{tl|Navbox}}. In most cases, the only required parameters are <code>name</code>, <code>title</code>, and <code>list1</code>, though [[Template:Navbox/doc#Child navboxes|child navboxes]] do not even require those to be set.
{{tl|Navbox}} shares numerous common parameter names with its sister templates, {{tl|Navbox with columns}} and {{tl|Navbox with collapsible groups}}, for consistency and ease of use. Parameters marked with an asterisk (*) are common to all three master templates.
=== Setup parameters ===
; ''name''*
: The name of the template, which is needed for the "V • T • E" ("View • Talk • Edit") links to work properly on all pages where the template is used. You can enter <code><nowiki>{{subst:PAGENAME}}</nowiki></code> for this value as a shortcut. The name parameter is only mandatory if a <code>title</code> is specified, and the <code>border</code> parameter is not set, and the <code>navbar</code> parameter is not used to disable the navbar.
; ''state''* <span style="font-weight:normal;">[<code>autocollapse, collapsed, expanded, plain, off</code>]</span>{{anchor|Autocollapse}}
:* Defaults to <code>autocollapse</code>. A navbox with <code>autocollapse</code> will start out collapsed if there are two or more collapsible elements on the same page. Otherwise, the navbox will be expanded. For the technically minded, see [[MediaWiki:Common.js]] (search for "autocollapse").
:* If set to <code>collapsed</code>, the navbox will always start out in a collapsed state.
:* If set to <code>expanded</code>, the navbox will always start out in an expanded state.
:* If set to <code>plain</code>, the navbox will always be expanded with no [hide] link on the right, and the title will remain centered (by using padding to offset the <small>V • T • E</small> links).
:* If set to <code>off</code>, the navbox will always be expanded with no [hide] link on the right, but no padding will be used to keep the title centered. This is for advanced use only; the "plain" option should suffice for most applications where the [show]/[hide] button needs to be hidden.
: To show the box when standalone (non-included) but then auto-hide contents when in an article, put "expanded" inside {{tag|noinclude|p}} tags. This setting will force the box to be visible when standalone (even when followed by other boxes), displaying "[hide]", but then it will auto-collapse the box when stacked inside an article:
:: <code><nowiki>| state = </nowiki></code>{{tag|noinclude|content=expanded}}
:Often times, editors will want a default initial state for a navbox, which may be overridden in an article. Here is the trick to do this:
:* In your intermediate template, create a parameter also named "state" as a pass-through like this: <pre><nowiki>| state = {{{state<includeonly>|your_desired_initial_state</includeonly>}}}</nowiki></pre>
:* The {{tag|includeonly|o}}<code>|</code> will make the template expanded when viewing the template page by itself.
:** Example 1: {{tl|Peso}} with ''autocollapse'' as the default initial state. [[Catalan peseta]] transcludes it and has only one navbox; thus, the peso navbox shows. [[Chilean peso]] has more than two navboxes; thus, the peso navbox collapses.
:** Example 2: {{tl|Historical currencies of Hungary}} with ''expanded'' as the default initial state, as such: <pre>| state = {{{state<includeonly>|expanded</includeonly>}}}</pre> All transcluding articles show the content by default, unless there is a hypothetical article that specifies <code><nowiki>{{templatename|state=collapsed}}</nowiki></code> when transcluding.
:** Example 3: {{tl|Tourism}} with ''collapsed'' as the default initial state, as such: <pre>| state = {{{state<includeonly>|collapsed</includeonly>}}}</pre> All transcluding articles will show the template as collapsed by default, but the template will still be uncollapsed when displayed on its own page.
:* The template {{tl|Collapsible option}} explains how to use the <code>state</code> parameter. It can be added to a {{tag|noinclude|p}} section after the template definition or to the instructions on the {{tl|documentation subpage}}.
; ''navbar''*
: If set to <code>plain</code>, the <span style="font-size: 88%;">V • T • E</span> links on the left side of the titlebar will not be displayed, and padding will be automatically used to keep the title centered. Use <code>off</code> to remove the <span style="font-size: 88%;">V • T • E</span> links, but not apply padding (this is for advanced use only; the "plain" option should suffice for most applications where a navbar is not desired). It is highly recommended that one not hide the navbar, in order to make it easier for users to edit the template, and to keep a standard style across pages.
; ''border''*
: ''See later section on [[#Child navboxes|using navboxes within one another]] for examples and a more complete description.'' If set to <code>child</code> or <code>subgroup</code>, then the navbox can be used as a borderless child that fits snugly in another navbox. The border is hidden and there is no padding on the sides of the table, so it fits into the ''list'' area of its parent navbox. If set to <code>none</code>, then the border is hidden and padding is removed, and the navbox may be used as a child of another container (do not use the <code>none</code> option inside of another navbox; similarly, only use the <code>child</code>/<code>subgroup</code> option inside of another navbox). If set to anything else (default), then a regular navbox is displayed with a 1px border. An alternate way to specify the border to be a subgroup style is like this (i.e. use the first unnamed parameter instead of the named ''border'' parameter):
:<pre>{{Navbox|child|...}}</pre>
=== Cells ===
; ''title''*
: Text that appears centered in the top row of the table. It is usually the template's topic, i.e. a succinct description of the body contents. This should be a single line, but if a second line is needed, use <code><nowiki>{{-}}</nowiki></code> to ensure proper centering. This parameter is technically not mandatory, but using {{tl|Navbox}} is rather pointless without a title.
; ''above''*
: A full-width cell displayed between the titlebar and first group/list, i.e. ''above'' the template's body (groups, lists and image). In a template without an image, ''above'' behaves in the same way as the ''list1'' parameter without the ''group1'' parameter.
; ''group<sub>n</sub>''*
: (i.e. ''group1'', ''group2'', etc.) If specified, text appears in a header cell displayed to the left of ''list<sub>n</sub>''. If omitted, ''list<sub>n</sub>'' uses the full width of the table.
; ''list<sub>n</sub>''*
: (i.e. ''list1'', ''list2'', etc.) The body of the template, usually a list of links. Format is inline, although the text can be entered on separate lines if the entire list is enclosed within <code><nowiki><div> </div></nowiki></code>. At least one ''list'' parameter is required; each additional ''list'' is displayed in a separate row of the table. Each ''list<sub>n</sub>'' may be preceded by a corresponding ''group<sub>n</sub>'' parameter, if provided (see below).
:Entries should be separated using a [[newline]] and an [[asterisk]] (*). If instead two asterisks are used, it provides [[Nesting (computing)|nesting]] within the previous entry by enclosing the entry with brackets. Increasing the number of asterisks used increases the number of brackets around entries.
; ''image''*
: An image to be displayed in a cell below the title and to the right of the body (the groups/lists). For the image to display properly, the ''list1'' parameter must be specified. The ''image'' parameter accepts standard wikicode for displaying an image, ''e.g.'': <pre>[[File:</nowiki><var>XX</var><nowiki>.jpg|80px|link=|alt=]]</pre> nb: including "|right" will produce the usual left margin to provide separation from the list items and [[Zebra striping (computer graphics)|zebra striping]].
:Note that most of such images don't comply with [[MOS:DECOR]] and should be removed at sight. A rare example of a correct usage would be [[special:permalink/995622594|this one]]: a map shows (in green) the location of a region within the state of Kazakhstan, and this is consistently implemented for [[:category:Kazakhstan region templates|all state's regions]].
; ''imageleft''*
: An image to be displayed in a cell below the title and to the left of the body (lists). For the image to display properly, the ''list1'' parameter must be specified and no groups can be specified. It accepts the same sort of parameter that ''image'' accepts.
; ''below''*
: A full-width cell displayed ''below'' the template's body (groups, lists and image). In a template without an image, ''below'' behaves in the same way as the template's final ''list<sub>n</sub>'' parameter without a ''group<sub>n</sub>'' parameter. For an example of the ''below'' parameter in use, see {{oldid|Main Page|352612160|this}} version of {{tl|Lists of the provinces and territories of Canada}}. {{tl|icon}} is often used for non-article links, for example <code><nowiki>{{icon|category}} [[:Category:</nowiki>''name''<nowiki>|Category]]</nowiki></code>.
=== Style parameters ===
Styles are generally advised against, to maintain consistency among templates and pages in Wikipedia; but the option to modify styles is given.
; ''bodystyle''*
: Specifies [[Cascading Style Sheets|CSS]] styles to apply to the template body. This option should be used sparingly as it can lead to visual inconsistencies. Examples:
:* <code>bodystyle = background: #''nnnnnn'';</code>
:* <code>bodystyle = width: ''N'' [em/%/px or width: auto];</code>
:* <code>bodystyle = float: [''left/right/none''];</code>
:* <code>bodystyle = clear: [''right/left/both/none''];</code>
; ''basestyle''*
: CSS styles to apply to the ''title'', ''above'', ''below'', and ''group'' cells all at once. The styles are not applied to ''list'' cells. This is convenient for easily changing the basic color of the navbox without having to repeat the style specifications for the different parts of the navbox. Example: <code>basestyle = background: lightskyblue;</code>
; ''titlestyle''*
: [[Cascading Style Sheets|CSS]] styles to apply to ''title'', most often the titlebar's background color:
:* <code>titlestyle = background: ''#nnnnnn'';</code>
:* <code>titlestyle = background: ''name'';</code>
:* <code>titlestyle = background: none;</code> — for no background color
; ''groupstyle''*
: CSS styles to apply to the ''groupN'' cells. This option overrides any styles that are applied to the entire table. Examples:
:* <code>groupstyle = background: #''nnnnnn'';</code>
:* <code>groupstyle = text-align: [''left/center/right''];</code>
:* <code>groupstyle = vertical-align: [''top/middle/bottom''];</code>
; ''group<sub>n</sub>style''*
: CSS styles to apply to a specific group, in addition to any styles specified by the ''groupstyle'' parameter. This parameter should only be used when absolutely necessary in order to maintain standardization and simplicity. Example: <code>group3style = background: red; color: white;</code>
; ''groupwidth''
: A number and unit specifying a uniform width for the group cells, in cases where little content in the list cells may cause group cells to be too wide. No default. However, may be overridden by the ''group(n)style'' parameter. Example: <code>groupwidth = 9em</code>
; ''liststyle''*
: CSS styles to apply to all lists. Overruled by the ''oddstyle'' and ''evenstyle'' parameters (if specified) hereafter. When using backgound colors in the navbox, see the [[#Intricacies|note hereafter]].
; ''list<sub>n</sub>style''*
: CSS styles to apply to a specific list, in addition to any styles specified by the ''liststyle'' parameter. This parameter should only be used when absolutely necessary in order to maintain standardization and simplicity. Example: <code>list5style = background: #ddddff;</code>
; ''listpadding''*
: A number and unit specifying the padding in each ''list'' cell. The ''list'' cells come equipped with a default padding of 0.25em on the left and right, and 0 on the top and bottom. Due to complex technical reasons, simply setting "liststyle = padding: 0.5em;" (or any other padding setting) will not work. Examples:
:* <code>listpadding = 0.5em 0;</code> (sets 0.5em padding for the top/bottom, and 0 padding for the left/right.)
:* <code>listpadding = 0;</code> (removes all list padding.)
; ''oddstyle''
; ''evenstyle''
: Applies to odd/even list numbers. Overrules styles defined by ''liststyle''. The default behavior is to add striped colors (white and gray) to odd/even rows, respectively, in order to improve readability. These should not be changed except in extraordinary circumstances.
; ''evenodd'' <span style="font-weight: normal;"><code>[swap, even, odd, off]</code></span>
: If set to <code>swap</code>, then the automatic striping of even and odd rows is reversed. Normally, even rows get a light gray background for striping; when this parameter is used, the odd rows receive the gray striping instead of the even rows. Setting to <code>even</code> or <code>odd</code> sets all rows to have that striping color. Setting to <code>off</code> disables automatic row striping.
; ''abovestyle''*
; ''belowstyle''*
: CSS styles to apply to the top cell (specified via the ''above'' parameter) and bottom cell (specified via the ''below'' parameter). Typically used to set background color or text alignment:
:* <code>abovestyle = background: #''nnnnnn'';</code>
:* <code>abovestyle = text-align: [''left/center/right''];</code>
:* <code>belowstyle = background: #''nnnnnn'';</code>
:* <code>belowstyle = text-align: [''left/center/right''];</code>
; ''imagestyle''*
; ''imageleftstyle''*
: CSS styles to apply to the cells where the image/imageleft sits. These styles should only be used in exceptional circumstances, usually to fix width problems if the width of groups is set and the width of the image cell grows too large. Example: <code>imagestyle = width:5em;</code>
===== Default styles =====
The style settings listed here are those that editors using the navbox change most often. The other more complex style settings were left out of this list to keep it simple. Most styles are set in [[MediaWiki:Common.css]].
<syntaxhighlight lang="css">
bodystyle = background: #fdfdfd; width: 100%; vertical-align: middle;
titlestyle = background: #ccccff; padding-left: 1em; padding-right: 1em; text-align: center;
abovestyle = background: #ddddff; padding-left: 1em; padding-right: 1em; text-align: center;
belowstyle = background: #ddddff; padding-left: 1em; padding-right: 1em; text-align: center;
groupstyle = background: #ddddff; padding-left: 1em; padding-right: 1em; text-align: right;
liststyle = background: transparent; text-align: left/center;
oddstyle = background: transparent;
evenstyle = background: #f7f7f7;
</syntaxhighlight>
Since ''liststyle'' and ''oddstyle'' are transparent, odd lists have the color of the ''bodystyle'', which defaults to #fdfdfd (white with a hint of gray). A list defaults to <code>text-align: left;</code> if it has a group, if not it defaults to <code>text-align: center;</code>. Since only ''bodystyle'' has a vertical-align all the others inherit its <code>vertical-align: middle;</code>.
=== Advanced parameters ===
; ''bodyclass''
; ''aboveclass''
; ''groupclass''
; ''listclass''
; ''belowclass''
: This enables attaching a CSS class to group or list cells. The most common use for ''listclass'' is to give it the <code>hlist</code> class that will cause lists to render horizontally. All these parameters accept the <code>hlist</code> class, but if more than one parameter is used for <code>hlist</code>, use {{para|bodyclass|hlist}} instead.
:{{tl|navbox}} automatically adds the class <code>nowraplinks</code> which can be overridden, for example with <code>{{para|listclass|wraplinks}}</code>.
; ''innerstyle''
: A very advanced parameter to be used ''only'' for advanced meta-templates employing the navbox. Internally, the navbox uses an outer table to draw the border, and then an inner table for everything else (title/above/groups/lists/below/images, etc.). The ''style''/''bodystyle'' parameter sets the style for the outer table, which the inner table inherits, but in advanced cases (meta-templates) it may be necessary to directly set the style for the inner table. This parameter provides access to that inner table so styles can be applied. Use at your own risk.
; ''nowrapitems''
: Setting <code>|nowrapitems=yes</code> applies nowrap to each line in a list item, and to any <code>above</code> or <code>below</code> item.
; ''orphan''
: Setting <code>|orphan=yes</code> in a child navbox fixes odd/even striping and removes [[:Category:Navbox orphans]].
==== Microformats ====
; ''bodyclass''
: This parameter is inserted into the "class" attribute for the navbox as a whole.
; ''titleclass''
: This parameter is inserted into the "class" attribute for the navbox's title caption.
This template supports the addition of microformat information. This is done by adding "class" attributes to various data cells, indicating what kind of information is contained within. To flag a navbox as containing [[hCard]] information about a person, for example, add the following parameter:
<pre>
| bodyclass = vcard
</pre>
''and''
<pre>
| titleclass = fn
</pre>
''or'' (for example):
<pre><nowiki>
| title = The books of <span class="fn">[[Iain Banks]]</span>
</nowiki></pre>
...and so forth.
See [[Wikipedia:WikiProject Microformats]] for more information on adding microformat information to Wikipedia, and [[microformat]] for more information on microformats in general.
== Layout of table ==
===Without image, above and below===
Table generated by {{tl|Navbox}} '''without''' ''image'', ''above'' and ''below'' parameters (gray list background color added for illustration only):
{{{{PAGENAMETDOC}}
| name = Navbox/doc
| state = uncollapsed
| liststyle = background: silver;
| title = {{{title}}}
| group1 = {{{group1}}}
| list1 = {{{list1}}}
| group2 = {{{group2}}}
| list2 = {{{list2}}}
| list3 = {{{list3}}} ''without {{{group3}}}''
| group4 = {{{group4}}}
| list4 = {{{list4}}}
}}
===With image, above and below===
Table generated by {{tl|Navbox}} '''with''' ''image'', ''above'' and ''below'' parameters (gray list background color added for illustration only):
{{{{PAGENAMETDOC}}
| name = Navbox/doc
| state = uncollapsed
| liststyle = background: silver;
| image = {{{image}}}
| title = {{{title}}}
| above = {{{above}}}
| group1 = {{{group1}}}
| list1 = {{{list1}}}
| group2 = {{{group2}}}
| list2 = {{{list2}}}
| list3 = {{{list3}}} ''without {{{group3}}}''
| group4 = {{{group4}}}
| list4 = {{{list4}}}
| below = {{{below}}}
}}
===With image and without groups===
Table generated by {{tl|Navbox}} '''with''' ''image'', ''imageleft'', ''lists'', and '''without''' ''groups'', ''above'', ''below'' (gray list background color added for illustration only):
{{{{PAGENAMETDOC}}
| name = Navbox/doc
| state = uncollapsed
| liststyle = background: silver;
| image = {{{image}}}
| imageleft = {{{imageleft}}}
| title = {{{title}}}
| list1 = {{{list1}}}
| list2 = {{{list2}}}
| list3 = {{{list3}}}
| list4 = {{{list4}}}
}}
== Examples ==
<!-- Please do not encourage folks to use <div> within Navboxes as (unless handled carefully) they can negate liststyles/groupstyles/etc. settings. -->
=== No image ===
<syntaxhighlight lang="wikitext" style="overflow: auto;">
{{Navbox
| name = Navbox/doc
| title = [[MSC Malaysia]]
| listclass = hlist
| group1 = Centre
| list1 =
* [[Cyberjaya]]
| group2 = Area
| list2 =
* [[Klang Valley]]
| group3 = Major landmarks
| list3 =
* [[Petronas Twin Towers]]
* [[Kuala Lumpur Tower]]
* [[Kuala Lumpur Sentral]]
* [[Technology Park Malaysia]]
* [[Putrajaya]]
* [[Cyberjaya]]
* [[Kuala Lumpur International Airport]]
| group4 = Infrastructure
| list4 =
* [[Express Rail Link]]
* [[KL-KLIA Dedicated Expressway]]
| group5 = Prime applications
| list5 =
* [[E-Government]]
* [[MyKad]]
}}
</syntaxhighlight>
{{{{PAGENAMETDOC}}
| name = Navbox/doc
| state = uncollapsed
| title = [[MSC Malaysia]]
| listclass = hlist
| group1 = Centre
| list1 =
* [[Cyberjaya]]
| group2 = Area
| list2 =
* [[Klang Valley]]
| group3 = Major landmarks
| list3 =
* [[Petronas Twin Towers]]
* [[Kuala Lumpur Tower]]
* [[Kuala Lumpur Sentral]]
* [[Technology Park Malaysia]]
* [[Putrajaya]]
* [[Cyberjaya]]
* [[Kuala Lumpur International Airport]]
| group4 = Infrastructure
| list4 =
* [[Express Rail Link]]
* [[KL-KLIA Dedicated Expressway]]
| group5 = Prime applications
| list5 =
* [[E-Government]]
* [[MyKad]]
}}
== Child navboxes ==
{{Selfref|For additional examples, see the [[Template:Navbox/testcases|Navbox testcases page]].}}
It is possible to place multiple navboxes within a single border by using "child" as the first parameter, or by setting the ''border'' parameter. The basic code for doing this is as follows (which adds a subgroup for the first group/list area):
<pre style="overflow: auto;">
{{Navbox
| name = {{subst:PAGENAME}}
| title = Title
| group1 = [optional]
| list1 = {{Navbox|child
...child navbox parameters...
}}
...
}}
</pre>
=== Subgroups example ===
This example shows two subgroups created using <code>child</code> as the first unnamed parameter. The striping is alternated automatically. To remove the striping altogether, you can set <code>liststyle = background:transparent;</code> in each of the navboxes.
{{{{PAGENAMETDOC}}
| name = Navbox/doc
| state = uncollapsed
| title = Multiple subgroup example
| above = Above
| below = Below
| group1 = Group1
| list1 = List1
| group2 = Group2
| list2 =
{{{{PAGENAMETDOC}}|child
| group1 = Group2.1
| list1 = List1
| group2 = Group2.2
| list2 = List2
| group3 = Group2.3
| list3 = List3
}}
| group3 = Group3
| list3 = List3
| group4 = Group4
| list4 =
{{{{PAGENAMETDOC}}|child
| group1 = Group4.1
| list1 = List1
| group2 = Group4.2
| list2 = List2
| group3 = Group4.3
| list3 = List3
}}
}}
=== Multiple show/hides in a single container ===
{{main|Template:Navbox with collapsible groups}}
The example below is generated using a regular navbox for the main container, then its list1, list2, and list3 parameters each contain another navbox, with <code>1 = child</code> set. The view (v), talk (t), edit (e) navbar links are hidden using <code>navbar = plain</code> for each of them, or could be suppressed by just leaving out the ''name'' parameter (child navboxes do not require the name parameter to be set, unlike regular navboxes).
{{{{PAGENAMETDOC}}
| name = Navbox/doc
| title = [[French colonial empire|Former French overseas empire]]
| state = uncollapsed
| list1 = {{{{PAGENAMETDOC}}|child
| navbar = plain
| title = [[French colonial empire|Former French colonies]] in [[Africa]] and the [[Indian Ocean]]
| listclass = hlist
| group1 = [[Mahgreb]]
| list1 =
* [[French rule in Algeria|Algeria]]
* [[French Morocco|Morocco]] <small>([[Arguin|Arguin Island]])</small>
* [[History of Tunisia|Tunisia]]
| group2 = [[French West Africa]]
| list2 =
* [[History of Côte d'Ivoire#French Period|Côte d'Ivoire]]
* [[French Dahomey|Dahomey]]
* [[French Sudan]]
* [[French Guinea|Guinea]]
* [[History of Mauritania#French colonization and post-colonial history|Mauritania]]
* [[History of Niger#Colonization|Niger]]
* [[History of Senegal|Senegal]]
* [[French Upper Volta|Upper Volta]]
* [[French Togoland]]
* [[James Island (The Gambia)|James Island]]
| group3 = [[French Equatorial Africa]]
| list3 =
* [[Colonial Chad|Chad]]
* [[History of Gabon|Gabon]]
* [[History of the Republic of the Congo|Middle Congo]]
* [[Oubangui-Chari]]
| group4 = [[Comoros]]
| list4 =
* [[Anjouan]]
* [[Grande Comore]]
* [[Mohéli]]
* [[History of Djibouti#French Interest|French Somaliland (Djibouti)]]
* [[History of Madagascar#French control|Madagascar]]
* [[Mauritius|Ile de France]]
* [[Seychelles]]
}}
| list2 = {{{{PAGENAMETDOC}}|child
| navbar = plain
| title = [[French colonial empire|Former French colonies]] in the [[Americas]]
| listclass = hlist
| list1 =
* [[New France]]{{spaces|2}}<small>([[Acadia]], [[Louisiana (New France)|Louisiana]], [[Canada, New France|Canada]], [[Newfoundland (island)|Terre Neuve]]) 1655–1763 </small>
| list2 =
* [[Inini]]
* [[Berbice]]
* [[Saint-Domingue]]
* <small>[[Haiti]]</small>
* [[Tobago]]
* [[History of the British Virgin Islands|Virgin Islands]]
* [[France Antarctique]]
* [[France Équinoxiale]]
| below = [[French West India Company]]
}}
| list3 = {{{{PAGENAMETDOC}}|child
| navbar = plain
| title = [[French colonial empire|Former French colonies]] in [[Asia]] and [[Oceania]]
| listclass = hlist
| group1 = [[French India]]
| list1 =
* [[Chandernagor]]
* [[Coromandel Coast]]
* [[History of Chennai|Madras]]
* [[Mahé, India|Mahé]]
* [[History of Pondicherry|Pondichéry]]
* [[Karaikal]]
* [[Yanam (India)|Yanaon]]
| group2 = [[French Indochina]]
| list2 =
* [[Colonial Cambodia|Cambodia]]
* [[History of Laos to 1945#French Laos|Laos]]
* [[French Indochina|Vietnam]] <small>([[Annam (French colony)|Annam]], [[Cochinchina]], [[Tonkin]])</small>
| group3 = Other Asian
| list3 =
* [[Alawite State|Alaouites]]
* [[Republic of Hatay|Alexandretta-Hatay]]
* [[Sri Lanka|Ceylon]]
* [[Kwangchowan]]
| group4 = [[Oceania]]
| list4 =
* [[New Hebrides]]
** [[History of Vanuatu|Vanuatu]]
| below = [[French East India Company]]
}}
}}
== Relationship with other Navbox templates ==
This navbox template works in conjunction with two other templates: {{tl|Navbox with columns}} and {{tl|Navbox with collapsible groups}}. All three of these templates share common parameters for consistency and ease of use (such parameters are marked with an asterisk (*) in the [[#Parameter descriptions|parameter descriptions]] list hereinbefore). Most importantly, each template can be used as a child of one another (by using the {{para|border|child}} parameter, or by specifying the first unnamed parameter to be <code>child</code>. For example: <code><nowiki>{{Navbox|child ...}}</nowiki></code>, <code><nowiki>{{Navbox with columns|child ...}}</nowiki></code> or <code><nowiki>{{Navbox with collapsible groups|child ...}}</nowiki></code>.)
== Technical details ==
* The {{navbar|1=:{{FULLPAGENAME}}|mini=on}} links are produced by [[Template:Navbar]]. If you have a question about them, it is probably best to ask at [[Template talk:Navbar]].
* The 2px wide border between groups and lists is drawn using the border-left property of the list cell. Thus, if you wish to change the background color of the template (for example <code>bodystyle = background:purple;</code>), then you'll need to make the border-left-color match the background color (i.e. <code>liststyle = border-left-color: purple;</code>). If you wish to have a border around each list cell, then the 2px border between the list cells and group cells will disappear; you'll have to come up with your own solution.
* Adjacent navboxes have only a 1 pixel border between them. If you set the top or bottom margin of <code>style/bodystyle</code>, then this will not work.
* The default margin-left and margin-right of the outer navbox table are set to "auto;". If you wish to use navbox as a float, you need to manually set the margin-left and margin-right values, because the auto margins interfere with the float option. For example, add the following code to use the navbox as a float:
** <code>bodystyle = width: 22em; float: right; margin-left: 1em; margin-right: 0;</code>
=== Copying to other projects or wikis ===
If you are trying to copy {{tlf|Navbox}} to your local wiki, there are several other things that must be installed or copied over as well:
* The [[mw:Extension:Scribunto|Scribunto]] and [[:mw:Extension:TemplateStyles|TemplateStyles]] extensions must be installed.
* [[Module:Navbox]] and its module and TemplateStyles dependencies, listed in the above two links
* Optionally, the <code>Add support to mw-collapsible for autocollapse, innercollapse and outercollapse</code> script from [[MediaWiki:Common.js]] may be copied, if autocollapsing is desired.
== TemplateData ==
{{TemplateDataHeader}}
<templatedata>
{
"params": {
"state": {
"label": "State",
"description": "Controls when a navbox is expanded or collapsed",
"example": "autocollapse",
"suggestedvalues": [
"autocollapse",
"collapsed",
"expanded",
"plain",
"off"
],
"default": "autocollapse",
"suggested": true
},
"title": {
"label": "Title",
"description": "Text in the title bar; centered in the top row of the table. Usually the template's topic.",
"example": "[[Widget stuff]]",
"suggested": true
},
"above": {
"label": "Above",
"description": "Full-width cell displayed between the titlebar and first group/list, i.e. above the template's body (groups, lists and image)",
"type": "string",
"suggested": true
},
"image": {
"label": "Image",
"description": "Image to be displayed in a cell below the title and to the right of the body",
"example": "[[File:XX.jpg | 80px | link= | alt= ]]",
"type": "wiki-file-name",
"suggested": true
},
"group1": {
"label": "Group 1",
"description": "If specified, text appears in a header cell displayed to the left of list 1. If omitted, list 1 uses the full width of the table.",
"suggested": true
},
"list1": {
"label": "List 1",
"description": "Body of the template; usually a list of links. Format is inline. At least one list parameter is required; each additional list is displayed in a separate row of the table. Each listn may be preceded by a corresponding groupn parameter.\nEntries should be separated using a newline and an asterisk. If two asterisks are used, it provides nesting within the previous entry with brackets.",
"required": true,
"suggested": true
},
"group2": {
"suggested": true
},
"list2": {
"suggested": true
},
"list3": {
"suggested": true
},
"group3": {
"suggested": true
},
"group4": {},
"list4": {},
"below": {
"label": "Below",
"description": "Full-width cell displayed below the template's body.",
"suggested": true
},
"imageleft": {
"label": "Image left",
"description": "Image to be displayed in a cell below the title and to the left of the body. For the image to display properly, list1 parameter must be specified and no groups can be specified.",
"example": "[[File:XX.jpg | 80px | link= | alt= ]]",
"type": "wiki-file-name"
},
"name": {
"label": "Name",
"description": "The name of the template. Needed for \"View • Talk • Edit\" links to work properly.",
"type": "string",
"default": "{{subst:PAGENAME}}{{subst:void|Don't change anything on this line. It will change itself when you save.}}",
"suggested": true
},
"listclass": {
"label": "List class",
"description": "CSS class for the list cells, usually hlist for horizontal lists. Alternatively, use bodyclass for the whole box.",
"example": "hlist",
"type": "string"
},
"navbar": {
"label": "Navbar status",
"example": "plain, off",
"type": "string"
},
"border": {
"label": "Border status",
"example": "child, subgroup, none",
"type": "string"
},
"bodystyle": {},
"basestyle": {},
"titlestyle": {},
"groupstyle": {},
"group1style": {},
"groupwidth": {},
"liststyle": {},
"list1style": {},
"listpadding": {},
"oddstyle": {},
"evenstyle": {},
"evenodd": {
"suggestedvalues": [
"swap",
"even",
"odd",
"off"
]
},
"abovestyle": {},
"belowstyle": {},
"imagestyle": {},
"imageleftstyle": {}
},
"description": "Creates a navigational box for links to other pages. \nDoes not display in mobile.",
"paramOrder": [
"name",
"title",
"group1",
"list1",
"listclass",
"state",
"above",
"below",
"image",
"group2",
"list2",
"group3",
"list3",
"group4",
"list4",
"imageleft",
"navbar",
"border",
"bodystyle",
"basestyle",
"titlestyle",
"groupstyle",
"liststyle",
"group1style",
"list1style",
"groupwidth",
"listpadding",
"oddstyle",
"evenstyle",
"evenodd",
"abovestyle",
"belowstyle",
"imagestyle",
"imageleftstyle"
]
}
</templatedata>
== See also ==
* {{tl|Navboxes}} — groups several navigation boxes together.
* {{tl|Nobold}} — To display text at normal font-weight within a context where the default font-weight is bold, e.g. header cells in tables.
* {{tl|Sidebar}} — Vertically-aligned navigation templates.
* {{tl|Navbox documentation}} — Shows the standard documentation using {{tl|Documentation}}.
* [[Template:Navbox/testcases]] — For additional examples of template code.
* [[Wikipedia:Line-break handling]] — The how-to guide about how to handle word wraps (line breaks) on Wikipedia, such as the wrapping of the link lists used in navboxes.
* [[Wikipedia:Template documentation]] — Guideline to creating the accompanying documentation
* {{tl|Nowrap begin}}, {{tl|·}} and {{tl|•}} are '''deprecated''' in favor of the <code>hlist</code> class for formatting lists. See [[Template:Flatlist#Technical details|Flatlist]] for a technical explanation of how <code>hlist</code> works.
=== Tracking categories ===
* {{clc|Navbox orphans}}
* {{clc|Navigational boxes without horizontal lists}}
* {{clc|Navboxes using background colours}}
* {{clc|Potentially illegible navboxes}}
* {{clc|Navboxes using borders}}
{{Navigation templates}}
<includeonly>{{sandbox other||
<!-- Add categories below this line, and interwikis at Wikidata -->
[[Category:Navbox meta-templates| ]]
[[Category:Templates generating microformats]]
[[Category:Templates that are not mobile friendly]]
[[Category:Collapse templates]]
}}</includeonly>
d066d126011321a46760c550d71ae2a7a76c9fe3
Template:Dated maintenance category (articles)
10
146
252
251
2024-03-26T22:42:11Z
Vicht
1
1 revision imported
wikitext
text/x-wiki
{{Dated maintenance category
|onlyarticles=yes
|1={{{1|}}}
|2={{{2|}}}
|3={{{3|}}}
|4={{{4|}}}
|5={{{5|}}}
}}<noinclude>
{{documentation|Template:Dated maintenance category/doc}}
</noinclude>
6bbc57c75cc28708a0e71dd658224d5945d80d68
Template:Characters
10
147
253
2024-03-26T23:48:14Z
Vicht
1
Created page with "{{Navbox | state = plain | listclass = hlist | title = Characters | group1 = Heroes | list1 = {{Navbox|child | group2 = An Arkhellen Adventure | list2 = * [[Grokko]] * [[Kenneth]] * [[Kham]] * [[Mira]] * [[Vichthart]] * [[Etaf]] * [[Grimm]] | group3 = [[The Piß Keepers]] | list3 = * [[Elias]] * [[Grezz]] * [[Cora Hothead]] * [[Slabbledab]] | group4 = Dragon Barrow | list4 = * [[Mai Dèanta]] * [[Iagan Liath]] * [[Ealar Sgàrlaid]] * [[Tasgall Uaine]] | group5 = Tal..."
wikitext
text/x-wiki
{{Navbox
| state = plain
| listclass = hlist
| title = Characters
| group1 = Heroes
| list1 =
{{Navbox|child
| group2 = An Arkhellen Adventure
| list2 =
* [[Grokko]]
* [[Kenneth]]
* [[Kham]]
* [[Mira]]
* [[Vichthart]]
* [[Etaf]]
* [[Grimm]]
| group3 = [[The Piß Keepers]]
| list3 =
* [[Elias]]
* [[Grezz]]
* [[Cora Hothead]]
* [[Slabbledab]]
| group4 = Dragon Barrow
| list4 =
* [[Mai Dèanta]]
* [[Iagan Liath]]
* [[Ealar Sgàrlaid]]
* [[Tasgall Uaine]]
| group5 = Talyen Tales
| list5 =
* [[Elmar Grunmeier]]
* [[Tayana Ralovyre]]
* [[Verdec Sharakas]]
* [[Kuno Wirz]]
}} <!-- End Heroes -->
| group6 = [[Meeresdorf]]
| list6 =
* [[Barthon]]
* [[Bracka]]
* [[Solomon Dugraf]]
* [[Lania Falst]]
* [[Captain Gaardan Haupmann]]
* [[Marta Tierstärk]]
* [[Merric Tierstärk]]
| group7 = [[Senneborn]]
| list7 =
* [[St Anorad]]
* [[Judita Bandelmann]]
* [[Captain Eggehart]]
* [[Ogdavis]]
* [[Kerstin Pletscher]]
* [[Brumnir Torfelt]]
| group8 = Droghen
| list8 =
* [[Arnt]]
* [[Bertrand]]
* [[Bezur]]
* [[Bill]]
* [[Davin]]
* [[Armine Detlef]]
* [[Droghen]]
* [[Falk]]
* [[Hilta]]
* [[Jochim]]
* [[Knuth]]
* [[Ogak]]
* [[Spotter]]
* [[Swiper]]
* [[Talxa]]
* [[Tark]]
* [[Vantan]]
| group9 = [[Zaheer island|Island]]
| list9 =
* [[Beatrux]]
* [[Celia]]
* [[Heineer Doonan]]
* [[Kylian]]
* [[Preston]]
* [[Srir Silthallow]]
* [[Szehga Silthallow]]
* [[Rrekkeh Stormcrawler]]
* [[Watcher]]
* [[Prince Yunogu]]
| group10 = [[Roughspun Coast]]
| list10 =
* [[Jenora Greenheart]]
* [[Handy]]
* [[Irebi]]
* [[Mist]]
* [[Tatha]]
* [[Yks]]
| group11 = [[Verein Kirche von Arkhelle]]
| list11 =
* [[Sable Warden Meriele Berevan]]
* [[Black]]
* [[Father Traulam Eugen]]
* [[Decheimül Fezzilbahn]]
* [[Father Eivald Glissan]]
* [[Holy Quorum]]
* [[Galesong Thervan Indále]]
* [[Pas]]
* [[Cardinal Maurul Silkendawn]]
| group12 = [[Kaarst]]
| list12 =
{{Navbox|child
| group13 = [[Kaarst City Watch|City Watch]]
| list13 =
* [[Orryn Daergel]]
* [[Sergeant Therai Doudra]]
* [[Eren]]
* [[Hilde]]
* [[Lieutenant General Inafel]]
* [[Tamaran]]
* [[Captain Felosiel Teinithra]]
* [[Vanas]]
| group14 = [[Squall's Beacon]]
| list14 =
* [[Eldon Garrick]]
* [[Amnon Ingolidan]]
* [[Samus]]
* [[Eurgaran Wihta]]
* [[Heda Wihta]]
| group15 = [[Knives of Mystra]]
| list15 =
* [[Etorn Hadaran]]
* [[Reiner Hoss]]
* [[Leagallow Tiaathque]]
* [[Uthan]]
* [[Yaan]]
| group16 = [[The Tide]]
| list16 =
* [[Arnuanna]]
* [[Esker]]
* [[Luther]]
* [[Orianna]]
* [[Rewyn]]
| group17 = [[Valiant Morgen Trading Company|Valiant Morgen]]
| list17 =
* [[Miss Erenbund]]
* [[Captain Adran Mokam]]
* [[Irann Rhogar]]
* [[Anselm Teklanis]]
* [[Tilos]]
* [[Thava Windreaver]]
| group18 = [[Acropolis of Kereskaa]]
| list18 =
* [[Elgrex Anderra]]
* [[Cansa Cinsmic]]
* [[Befrir Dalovamri]]
* [[Henry Hungleberry]]
* [[Suithrathus Luirmo]]
* [[Teklanna Morantine]]
* [[Farlu Naenreh]]
* [[Toross Rhistel]]
* [[Vithra Rutgeth]]
* [[Vastren]]
| group19 = Other
| list19 =
* [[Achima]]
* [[Bogdan]]
* [[Bogdin]]
* [[Delilah]]
* [[Ginger]]
* [[Kham Gohlrim]]
* [[Governor Escherin]]
* [[Claira Hanali]]
* [[Ertus Heda]]
* [[Thodris Holderheck]]
* [[C. B. L.]]
* [[Elira Lein]]
* [[Lilly]]
* [[Ser Reginald Kobolwitz]]
* [[Xandahire Kobolwitz]]
* [[Administrator Lorsalyn Pri]]
* [[Tyrant]]
}} <!-- End Kaarst subsets -->
| group20 = [[Fuarcrùn Freeholds]]
| list20 =
* [[Draca]]
* [[Ingen]]
* [[Kaelinu]]
| group21 = [[Havenhaft]]
| list21 =
* [[Charles]]
* [[Eoin]]
* [[James]]
* [[Alafonz Kalazorn]]
* [[Shusk]]
| group22 = [[Bergstraßer]]
| list22 =
* [[Iron Fang]]
* [[Seebo]]
* [[Doug Zenner]]
| group23 = [[Arkhellen Empire]]
| list23 =
* [[King Lorenz Arkhelle XVI]]
* [[Iron Tempest Mercenary Company]]
* [[Nikola]]
* [[Rosamund]]
| group24 = Gods
| list24 =
{{Navbox|child
| group25 = [[Verein Kirche von Arkhelle]]
| list25 =
* [[Avandra]]
* [[Bahamut]]
* [[Erathis]]
* [[Ioun]]
* [[Kord]]
* [[Moradin]]
* [[Mystra]]
* [[Pelor]]
* [[Raven Queen]]
* [[Sarenrae]]
* [[Selune]]
* [[Zaheer]]
| group26 = Other
| list26 =
* [[Bane]]
* [[Gruumsch]]
* [[Teli Monei]]
}} <!-- End of Gods -->
| group27 = Unknown
| list27 =
* [[Billy-Bob Gene-Joel]]
* [[Erdak]]
* [[Evailen]]
* [[Gurnin]]
* [[Jathnel]]
* [[Kinrel]]
* [[Florine Oakstein]]
}}
159f4ab09a359004935ae00900f68ed168b8c7e6
256
253
2024-03-28T02:16:32Z
Vicht
1
Added Valiant Morgen employees, pseudonyms and Ruda Frank
wikitext
text/x-wiki
{{Navbox
| state = plain
| listclass = hlist
| title = Characters
| group1 = Heroes
| list1 =
{{Navbox|child
| group2 = An Arkhellen Adventure
| list2 =
* [[Grokko]]
* [[Kenneth]]
* [[Kham]]
* [[Mira]]
* [[Vichthart]]
* [[Etaf]]
* [[Grimm]]
| group3 = [[The Piß Keepers]]
| list3 =
* [[Elias]]
* [[Grezz]]
* [[Cora Hothead]]
* [[Slabbledab]]
| group4 = Dragon Barrow
| list4 =
* [[Mai Dèanta]]
* [[Iagan Liath]]
* [[Ealar Sgàrlaid]]
* [[Tasgall Uaine]]
| group5 = Talyen Tales
| list5 =
* [[Elmar Grunmeier]]
* [[Tayana Ralovyre]]
* [[Verdec Sharakas]]
* [[Kuno Wirz]]
}} <!-- End Heroes -->
| group6 = [[Meeresdorf]]
| list6 =
* [[Barthon]]
* [[Bracka]]
* [[Solomon Dugraf]]
* [[Lania Falst]]
* [[Captain Gaardan Haupmann]]
* [[Marta Tierstärk]]
* [[Merric Tierstärk]]
| group7 = [[Senneborn]]
| list7 =
* [[St Anorad]]
* [[Judita Bandelmann]]
* [[Captain Eggehart]]
* [[Ogdavis]]
* [[Kerstin Pletscher]]
* [[Brumnir Torfelt]]
| group8 = Droghen
| list8 =
* [[Arnt]]
* [[Bertrand]]
* [[Bezur]]
* [[Bill]]
* [[Davin]]
* [[Armine Detlef]]
* [[Droghen]]
* [[Falk]]
* [[Hilta]]
* [[Jochim]]
* [[Knuth]]
* [[Ogak]]
* [[Spotter]]
* [[Swiper]]
* [[Talxa]]
* [[Tark]]
* [[Vantan]]
| group9 = [[Zaheer island|Island]]
| list9 =
* [[Beatrux]]
* [[Celia]]
* [[Heineer Doonan]]
* [[Kylian]]
* [[Preston]]
* [[Srir Silthallow]]
* [[Szehga Silthallow]]
* [[Rrekkeh Stormcrawler]]
* [[Watcher]]
* [[Prince Yunogu]]
| group10 = [[Roughspun Coast]]
| list10 =
* [[Jenora Greenheart]]
* [[Handy]]
* [[Irebi]]
* [[Mist]]
* [[Tatha]]
* [[Yks]]
| group11 = [[Verein Kirche von Arkhelle]]
| list11 =
* [[Sable Warden Meriele Berevan]]
* [[Black]]
* [[Father Traulam Eugen]]
* [[Decheimül Fezzilbahn]]
* [[Father Eivald Glissan]]
* [[Holy Quorum]]
* [[Galesong Thervan Indále]]
* [[Pas]]
* [[Cardinal Maurul Silkendawn]]
| group12 = [[Kaarst]]
| list12 =
{{Navbox|child
| group13 = [[Kaarst City Watch|City Watch]]
| list13 =
* [[Orryn Daergel]]
* [[Sergeant Therai Doudra]]
* [[Eren]]
* [[Hilde]]
* [[Lieutenant General Inafel]]
* [[Tamaran]]
* [[Captain Felosiel Teinithra]]
* [[Vanas]]
| group14 = [[Squall's Beacon]]
| list14 =
* [[Eldon Garrick]]
* [[Amnon Ingolidan]]
* [[Samus]]
* [[Eurgaran Wihta]]
* [[Heda Wihta]]
| group15 = [[Knives of Mystra]]
| list15 =
* [[Etorn Hadaran]]
* [[Reiner Hoss]]
* [[Leagallow Tiaathque]]
* [[Uthan]]
* [[Yaan]]
| group16 = [[The Tide]]
| list16 =
* [[Arnuanna]]
* [[Esker]]
* [[Luther]]
* [[Orianna]]
* [[Rewyn]]
| group17 = [[Valiant Morgen Trading Company|Valiant Morgen]]
| list17 =
* [[Antoniya Brosch]]
* [[Heathress Erenbund]]
* [[Malte Faerber]]
* [[Captain Adran Mokam]]
* [[Caphri Pilc]]
* [[Irann Rhogar]]
* [[Anselm Teklanis]]
* [[Tilos]]
* [[Thava Windreaver]]
| group18 = [[Acropolis of Kereskaa]]
| list18 =
* [[Elgrex Anderra]]
* [[Cansa Cinsmic]]
* [[Befrir Dalovamri]]
* [[Henry Hungleberry]]
* [[Suithrathus Luirmo]]
* [[Teklanna Morantine]]
* [[Farlu Naenreh]]
* [[Toross Rhistel]]
* [[Vithra Rutgeth]]
* [[Vastren]]
| group19 = Other
| list19 =
* [[Achima]]
* [[Bogdan]]
* [[Bogdin]]
* [[Delilah]]
* [[Ruda Frank]]
* [[Ginger]]
* [[Kham Gohlrim]]
* [[Governor Escherin]]
* [[Claira Hanali]]
* [[Ertus Heda]]
* [[Thodris Holderheck]]
* [[C. B. L.]]
* [[Elira Lein]]
* [[Lilly]]
* [[Ser Reginald Kobolwitz]]
* [[Xandahire Kobolwitz]]
* [[Administrator Lorsalyn Pri]]
* [[Tyrant]]
}} <!-- End Kaarst subsets -->
| group20 = [[Fuarcrùn Freeholds]]
| list20 =
* [[Draca]]
* [[Ingen]]
* [[Kaelinu]]
| group21 = [[Havenhaft]]
| list21 =
* [[Charles]]
* [[Eoin]]
* [[James]]
* [[Alafonz Kalazorn]]
* [[Shusk]]
| group22 = [[Bergstraßer]]
| list22 =
* [[Iron Fang]]
* [[Seebo]]
* [[Doug Zenner]]
| group23 = [[Arkhellen Empire]]
| list23 =
* [[King Lorenz Arkhelle XVI]]
* [[Iron Tempest Mercenary Company]]
* [[Nikola]]
* [[Rosamund]]
| group24 = Gods
| list24 =
{{Navbox|child
| group25 = [[Verein Kirche von Arkhelle]]
| list25 =
* [[Avandra]]
* [[Bahamut]]
* [[Erathis]]
* [[Ioun]]
* [[Kord]]
* [[Moradin]]
* [[Mystra]]
* [[Pelor]]
* [[Raven Queen]]
* [[Sarenrae]]
* [[Selune]]
* [[Zaheer]]
| group26 = Other
| list26 =
* [[Bane]]
* [[Gruumsch]]
* [[Teli Monei]]
}} <!-- End of Gods -->
| group27 = Pseudonyms
| list27 =
* [[Etorn Hadaran|Ashmaker]]
* [[Suithrathus Luirmo|Mr Curtain]]
* [[Esker|E]]
* [[Kham|Frank]]
* [[Szehga Silthallow|Gurta]]
* [[Szehga Silthallow|Haga]]
* [[Arnuanna|J]]
* [[Vichthart|Señor José]]
* [[Grokko|Julian]]
* [[Mystra|Kereskaa]]
* [[Grimm|Moose Knuckle]]
* [[Kham|My Emotions Will Never Hurt Me]]
* [[Vichthart|Priest Man]]
* [[Kenneth|Stoneboy]]
* [[Grokko|Strangehands]]
* [[Orianna|V]]
| group28 = Unknown
| list28 =
* [[Billy-Bob Gene-Joel]]
* [[Erdak]]
* [[Evailen]]
* [[Gurnin]]
* [[Jathnel]]
* [[Kinrel]]
* [[Florine Oakstein]]
}}
d0585b50e7af826c4f903020b1630b9235a108eb
262
256
2024-03-28T22:00:02Z
Vicht
1
Corrected alphabetic order of Kaarst > Other
wikitext
text/x-wiki
{{Navbox
| state = plain
| listclass = hlist
| title = Characters
| group1 = Heroes
| list1 =
{{Navbox|child
| group2 = An Arkhellen Adventure
| list2 =
* [[Grokko]]
* [[Kenneth]]
* [[Kham]]
** [[Grimm]]
* [[Mira]]
** [[Etaf]]
* [[Vichthart]]
| group3 = [[The Piß Keepers]]
| list3 =
* [[Elias]]
* [[Grezz]]
* [[Cora Hothead]]
* [[Slabbledab]]
| group4 = Dragon Barrow
| list4 =
* [[Mai Dèanta]]
* [[Iagan Liath]]
* [[Ealar Sgàrlaid]]
* [[Tasgall Uaine]]
| group5 = Talyen Tales
| list5 =
* [[Elmar Grunmeier]]
* [[Tayana Ralovyre]]
* [[Verdec Sharakas]]
* [[Kuno Wirz]]
}} <!-- End Heroes -->
| group6 = [[Meeresdorf]]
| list6 =
* [[Barthon]]
* [[Bracka]]
* [[Solomon Dugraf]]
* [[Lania Falst]]
* [[Captain Gaardan Haupmann]]
* [[Marta Tierstärk]]
* [[Merric Tierstärk]]
| group7 = [[Senneborn]]
| list7 =
* [[St Anorad]]
* [[Judita Bandelmann]]
* [[Captain Eggehart]]
* [[Ogdavis]]
* [[Kerstin Pletscher]]
* [[Brumnir Torfelt]]
| group8 = Droghen
| list8 =
* [[Arnt]]
* [[Bertrand]]
* [[Bezur]]
* [[Bill]]
* [[Davin]]
* [[Armine Detlef]]
* [[Droghen]]
* [[Falk]]
* [[Hilta]]
* [[Jochim]]
* [[Knuth]]
* [[Ogak]]
* [[Spotter]]
* [[Swiper]]
* [[Talxa]]
* [[Tark]]
* [[Vantan]]
| group9 = [[Zaheer island|Island]]
| list9 =
* [[Beatrux]]
* [[Celia]]
* [[Heineer Doonan]]
* [[Kylian]]
* [[Preston]]
* [[Srir Silthallow]]
* [[Szehga Silthallow]]
* [[Rrekkeh Stormcrawler]]
* [[Watcher]]
* [[Prince Yunogu]]
| group10 = [[Roughspun Coast]]
| list10 =
* [[Jenora Greenheart]]
* [[Handy]]
* [[Irebi]]
* [[Mist]]
* [[Tatha]]
* [[Yks]]
| group11 = [[Verein Kirche von Arkhelle]]
| list11 =
* [[Sable Warden Meriele Berevan]]
* [[Black]]
* [[Father Traulam Eugen]]
* [[Decheimül Fezzilbahn]]
* [[Father Eivald Glissan]]
* [[Holy Quorum]]
* [[Galesong Thervan Indále]]
* [[Pas]]
* [[Cardinal Maurul Silkendawn]]
| group12 = [[Kaarst]]
| list12 =
{{Navbox|child
| group13 = [[Kaarst City Watch|City Watch]]
| list13 =
* [[Orryn Daergel]]
* [[Sergeant Therai Doudra]]
* [[Eren]]
* [[Hilde]]
* [[Lieutenant General Inafel]]
* [[Tamaran]]
* [[Captain Felosiel Teinithra]]
* [[Vanas]]
| group14 = [[Squall's Beacon]]
| list14 =
* [[Eldon Garrick]]
* [[Amnon Ingolidan]]
* [[Samus]]
* [[Eurgaran Wihta]]
* [[Heda Wihta]]
| group15 = [[Knives of Mystra]]
| list15 =
* [[Etorn Hadaran]]
* [[Reiner Hoss]]
* [[Leagallow Tiaathque]]
* [[Uthan]]
* [[Yaan]]
| group16 = [[The Tide]]
| list16 =
* [[Arnuanna]]
* [[Esker]]
* [[Luther]]
* [[Orianna]]
* [[Rewyn]]
| group17 = [[Valiant Morgen Trading Company|Valiant Morgen]]
| list17 =
* [[Antoniya Brosch]]
* [[Heathress Erenbund]]
* [[Malte Faerber]]
* [[Captain Adran Mokam]]
* [[Caphri Pilc]]
* [[Irann Rhogar]]
* [[Anselm Teklanis]]
* [[Tilos]]
* [[Thava Windreaver]]
| group18 = [[Acropolis of Kereskaa]]
| list18 =
* [[Elgrex Anderra]]
* [[Cansa Cinsmic]]
* [[Befrir Dalovamri]]
* [[Henry Hungleberry]]
* [[Suithrathus Luirmo]]
* [[Teklanna Morantine]]
* [[Farlu Naenreh]]
* [[Toross Rhistel]]
* [[Vithra Rutgeth]]
* [[Vastren]]
| group19 = Other
| list19 =
* [[Achima]]
* [[Bogdan]]
* [[Bogdin]]
* [[Delilah]]
* [[Governor Escherin]]
* [[Ruda Frank]]
* [[Ginger]]
* [[Kham Gohlrim]]
* [[Claira Hanali]]
* [[Ertus Heda]]
* [[Thodris Holderheck]]
* [[Ser Reginald Kobolwitz]]
* [[Xandahire Kobolwitz]]
* [[C. B. L.]]
* [[Elira Lein]]
* [[Lilly]]
* [[Administrator Lorsalyn Pri]]
* [[Tyrant]]
}} <!-- End Kaarst subsets -->
| group20 = [[Fuarcrùn Freeholds]]
| list20 =
* [[Draca]]
* [[Ingen]]
* [[Kaelinu]]
| group21 = [[Havenhaft]]
| list21 =
* [[Charles]]
* [[Eoin]]
* [[James]]
* [[Alafonz Kalazorn]]
* [[Shusk]]
| group22 = [[Bergstraßer]]
| list22 =
* [[Iron Fang]]
* [[Seebo]]
* [[Doug Zenner]]
| group23 = [[Arkhellen Empire]]
| list23 =
* [[King Lorenz Arkhelle XVI]]
* [[Iron Tempest Mercenary Company]]
* [[Nikola]]
* [[Rosamund]]
| group24 = Gods
| list24 =
{{Navbox|child
| group25 = [[Verein Kirche von Arkhelle]]
| list25 =
* [[Avandra]]
* [[Bahamut]]
* [[Erathis]]
* [[Ioun]]
* [[Kord]]
* [[Moradin]]
* [[Mystra]]
* [[Pelor]]
* [[Raven Queen]]
* [[Sarenrae]]
* [[Selune]]
* [[Zaheer]]
| group26 = Other
| list26 =
* [[Bane]]
* [[Gruumsch]]
* [[Teli Monei]]
}} <!-- End of Gods -->
| group27 = Pseudonyms
| list27 =
* [[Etorn Hadaran|Ashmaker]]
* [[Suithrathus Luirmo|Mr Curtain]]
* [[Esker|E]]
* [[Kham|Frank]]
* [[Szehga Silthallow|Gurta]]
* [[Szehga Silthallow|Haga]]
* [[Arnuanna|J]]
* [[Vichthart|Señor José]]
* [[Grokko|Julian]]
* [[Mystra|Kereskaa]]
* [[Grimm|Moose Knuckle]]
* [[Kham|My Emotions Will Never Hurt Me]]
* [[Vichthart|Priest Man]]
* [[Kenneth|Stoneboy]]
* [[Grokko|Strangehands]]
* [[Orianna|V]]
| group28 = Unknown
| list28 =
* [[Billy-Bob Gene-Joel]]
* [[Erdak]]
* [[Evailen]]
* [[Gurnin]]
* [[Jathnel]]
* [[Kinrel]]
* [[Florine Oakstein]]
}}
a3484f988adf98a9124460288a9304e79ceda75f
264
262
2024-03-30T00:32:33Z
Vicht
1
Added Corellon
wikitext
text/x-wiki
{{Navbox
| state = plain
| listclass = hlist
| title = Characters
| group1 = Heroes
| list1 =
{{Navbox|child
| group2 = An Arkhellen Adventure
| list2 =
* [[Grokko]]
* [[Kenneth]]
* [[Kham]]
** [[Grimm]]
* [[Mira]]
** [[Etaf]]
* [[Vichthart]]
| group3 = [[The Piß Keepers]]
| list3 =
* [[Elias]]
* [[Grezz]]
* [[Cora Hothead]]
* [[Slabbledab]]
| group4 = Dragon Barrow
| list4 =
* [[Mai Dèanta]]
* [[Iagan Liath]]
* [[Ealar Sgàrlaid]]
* [[Tasgall Uaine]]
| group5 = Talyen Tales
| list5 =
* [[Elmar Grunmeier]]
* [[Tayana Ralovyre]]
* [[Verdec Sharakas]]
* [[Kuno Wirz]]
}} <!-- End Heroes -->
| group6 = [[Meeresdorf]]
| list6 =
* [[Barthon]]
* [[Bracka]]
* [[Solomon Dugraf]]
* [[Lania Falst]]
* [[Captain Gaardan Haupmann]]
* [[Marta Tierstärk]]
* [[Merric Tierstärk]]
| group7 = [[Senneborn]]
| list7 =
* [[St Anorad]]
* [[Judita Bandelmann]]
* [[Captain Eggehart]]
* [[Ogdavis]]
* [[Kerstin Pletscher]]
* [[Brumnir Torfelt]]
| group8 = Droghen
| list8 =
* [[Arnt]]
* [[Bertrand]]
* [[Bezur]]
* [[Bill]]
* [[Davin]]
* [[Armine Detlef]]
* [[Droghen]]
* [[Falk]]
* [[Hilta]]
* [[Jochim]]
* [[Knuth]]
* [[Ogak]]
* [[Spotter]]
* [[Swiper]]
* [[Talxa]]
* [[Tark]]
* [[Vantan]]
| group9 = [[Zaheer island|Island]]
| list9 =
* [[Beatrux]]
* [[Celia]]
* [[Heineer Doonan]]
* [[Kylian]]
* [[Preston]]
* [[Srir Silthallow]]
* [[Szehga Silthallow]]
* [[Rrekkeh Stormcrawler]]
* [[Watcher]]
* [[Prince Yunogu]]
| group10 = [[Roughspun Coast]]
| list10 =
* [[Jenora Greenheart]]
* [[Handy]]
* [[Irebi]]
* [[Mist]]
* [[Tatha]]
* [[Yks]]
| group11 = [[Verein Kirche von Arkhelle]]
| list11 =
* [[Sable Warden Meriele Berevan]]
* [[Black]]
* [[Father Traulam Eugen]]
* [[Decheimül Fezzilbahn]]
* [[Father Eivald Glissan]]
* [[Holy Quorum]]
* [[Galesong Thervan Indále]]
* [[Pas]]
* [[Cardinal Maurul Silkendawn]]
| group12 = [[Kaarst]]
| list12 =
{{Navbox|child
| group13 = [[Kaarst City Watch|City Watch]]
| list13 =
* [[Orryn Daergel]]
* [[Sergeant Therai Doudra]]
* [[Eren]]
* [[Hilde]]
* [[Lieutenant General Inafel]]
* [[Tamaran]]
* [[Captain Felosiel Teinithra]]
* [[Vanas]]
| group14 = [[Squall's Beacon]]
| list14 =
* [[Eldon Garrick]]
* [[Amnon Ingolidan]]
* [[Samus]]
* [[Eurgaran Wihta]]
* [[Heda Wihta]]
| group15 = [[Knives of Mystra]]
| list15 =
* [[Etorn Hadaran]]
* [[Reiner Hoss]]
* [[Leagallow Tiaathque]]
* [[Uthan]]
* [[Yaan]]
| group16 = [[The Tide]]
| list16 =
* [[Arnuanna]]
* [[Esker]]
* [[Luther]]
* [[Orianna]]
* [[Rewyn]]
| group17 = [[Valiant Morgen Trading Company|Valiant Morgen]]
| list17 =
* [[Antoniya Brosch]]
* [[Heathress Erenbund]]
* [[Malte Faerber]]
* [[Captain Adran Mokam]]
* [[Caphri Pilc]]
* [[Irann Rhogar]]
* [[Anselm Teklanis]]
* [[Tilos]]
* [[Thava Windreaver]]
| group18 = [[Acropolis of Kereskaa]]
| list18 =
* [[Elgrex Anderra]]
* [[Cansa Cinsmic]]
* [[Befrir Dalovamri]]
* [[Henry Hungleberry]]
* [[Suithrathus Luirmo]]
* [[Teklanna Morantine]]
* [[Farlu Naenreh]]
* [[Toross Rhistel]]
* [[Vithra Rutgeth]]
* [[Vastren]]
| group19 = Other
| list19 =
* [[Achima]]
* [[Bogdan]]
* [[Bogdin]]
* [[Delilah]]
* [[Governor Escherin]]
* [[Ruda Frank]]
* [[Ginger]]
* [[Kham Gohlrim]]
* [[Claira Hanali]]
* [[Ertus Heda]]
* [[Thodris Holderheck]]
* [[Ser Reginald Kobolwitz]]
* [[Xandahire Kobolwitz]]
* [[C. B. L.]]
* [[Elira Lein]]
* [[Lilly]]
* [[Administrator Lorsalyn Pri]]
* [[Tyrant]]
}} <!-- End Kaarst subsets -->
| group20 = [[Fuarcrùn Freeholds]]
| list20 =
* [[Draca]]
* [[Ingen]]
* [[Kaelinu]]
| group21 = [[Havenhaft]]
| list21 =
* [[Charles]]
* [[Eoin]]
* [[James]]
* [[Alafonz Kalazorn]]
* [[Shusk]]
| group22 = [[Bergstraßer]]
| list22 =
* [[Iron Fang]]
* [[Seebo]]
* [[Doug Zenner]]
| group23 = [[Arkhellen Empire]]
| list23 =
* [[King Lorenz Arkhelle XVI]]
* [[Iron Tempest Mercenary Company]]
* [[Nikola]]
* [[Rosamund]]
| group24 = Gods
| list24 =
{{Navbox|child
| group25 = [[Verein Kirche von Arkhelle]]
| list25 =
* [[Avandra]]
* [[Bahamut]]
* [[Erathis]]
* [[Ioun]]
* [[Kord]]
* [[Moradin]]
* [[Mystra]]
* [[Pelor]]
* [[Raven Queen]]
* [[Sarenrae]]
* [[Selune]]
* [[Zaheer]]
| group26 = Other
| list26 =
* [[Bane]]
* [[Corellon]]
* [[Gruumsch]]
* [[Teli Monei]]
}} <!-- End of Gods -->
| group27 = Pseudonyms
| list27 =
* [[Etorn Hadaran|Ashmaker]]
* [[Suithrathus Luirmo|Mr Curtain]]
* [[Esker|E]]
* [[Kham|Frank]]
* [[Szehga Silthallow|Gurta]]
* [[Szehga Silthallow|Haga]]
* [[Arnuanna|J]]
* [[Vichthart|Señor José]]
* [[Grokko|Julian]]
* [[Mystra|Kereskaa]]
* [[Grimm|Moose Knuckle]]
* [[Kham|My Emotions Will Never Hurt Me]]
* [[Vichthart|Priest Man]]
* [[Kenneth|Stoneboy]]
* [[Grokko|Strangehands]]
* [[Orianna|V]]
| group28 = Unknown
| list28 =
* [[Billy-Bob Gene-Joel]]
* [[Erdak]]
* [[Evailen]]
* [[Gurnin]]
* [[Jathnel]]
* [[Kinrel]]
* [[Florine Oakstein]]
}}
f5b068f1cefa32dbe7c70c64e45249f3f9aae6bb
Template:Locations
10
148
254
2024-03-27T02:21:58Z
Vicht
1
Created page with "{{Navbox | state = plain | listclass = hlist | title = Locations | group1 = Planes | list1 = * [[Nine Hells]] ** [[Nesus]] * [[Feywild]] | group2 = Bodies | list2 = * [[Asíl]] * [[Ashtkhaan]] {{Navbox|child | group3 = [[Talyen]] | list3 = * [[Calaha]] * [[Dhintay]] * [[Eaos]] * [[Savra]] * [[Spanish]] {{Navbox|child | group4 = [[Elengon]] | list4 = * [[Fuarcrùn Freeholds]] ** [[Scierce]] * [[Ifkhamurud]] * [[Kythera]] * [[Leurisan]] * [[Medinian Republic]] * Ros..."
wikitext
text/x-wiki
{{Navbox
| state = plain
| listclass = hlist
| title = Locations
| group1 = Planes
| list1 =
* [[Nine Hells]]
** [[Nesus]]
* [[Feywild]]
| group2 = Bodies
| list2 =
* [[Asíl]]
* [[Ashtkhaan]]
{{Navbox|child
| group3 = [[Talyen]]
| list3 =
* [[Calaha]]
* [[Dhintay]]
* [[Eaos]]
* [[Savra]]
* [[Spanish]]
{{Navbox|child
| group4 = [[Elengon]]
| list4 =
* [[Fuarcrùn Freeholds]]
** [[Scierce]]
* [[Ifkhamurud]]
* [[Kythera]]
* [[Leurisan]]
* [[Medinian Republic]]
* [[Rossaña]]
* [[Süddorn]]
* [[Sundering Sea]]
* [[Wüstenwast]]
{{Navbox|child
| group5 = [[Arkhellen Empire]]
| list5 =
* [[Arkhelle]]
** [[Baumeln]]
** [[Heldruh]]
** [[Hellenhelm]]
*** [[Wesselbern Palast]]
* [[Brenhalt]]
** [[Kalazorn Ranch]]
** [[Bükerstadt]]
** [[Stolzfestung]]
* [[Denkrei]]
** [[Bergstraßer]]
*** [[The Vicious Crab]]
*** [[Mountain Iron]]
** [[Schmiedentruum]]
* [[Teremberg]]
* [[Vargesse]]
* [[Verrameln]]
* [[Würtzollen]]
** [[Ostweg-Treffen]]
{{Navbox|child
| group6 = [[Scharn]]
| list6 =
* [[Heidestedt]]
* [[Roughspun Coast]]
* [[Salz Bay]]
* [[Scharnwald]]
{{Navbox|child
| group7 = [[Western Scharn]]
| list7 =
* [[Aleph Marsh]]
* [[Cralw]]
* [[Bacheim]]
* [[Darkwasser Wald]]
* [[Droghen's keep]]
* [[Gnoll encampment]]
* [[Zaheer island]]
* [[Kusen]]
* [[Löwenalt]]
* [[Salzreich]]
* [[Strandholm]]
* [[Wurzel Drain]]
* [[Wüsthafen]]
{{Navbox|child
| group8 = [[Meeresdorf]]
| list8 =
* [[Bear's End Inn]]
* [[Blue Birch Costermonger]]
* [[The Dauntless Shield]]
| group9 = [[Senneborn]]
| list9 =
* [[Broken Thorn]]
* [[Church of St Anorad]]
* [[The Katz und Imp]]
* [[Ogdavis' Apotheker]]
* [[Ratway]]
* [[Schnellhoof Carriagemaster's]]
}} <!-- End of Western Scharn -->
| group10 = [[Kaarst]]
| list10 =
* [[Anshaung Bridge]]
* [[City Watch Headquarters]]
* [[Kaarst City Waterworks Guild]]
* [[Kade Sirrine Kathedrale]]
* [[Karmesin Palast]]
* [[Kobolwitz Manor]]
* [[Lighning Tree]]
* [[Mastaff River]]
* [[Ravensfair]]
* [[Sombre Lyceum]]
* [[Squall's Beacon]]
* [[Valiant Morgen Trading Company Kaarst Branch]]
* [[Valiant Morgen Trading Company warehouse]]
{{Navbox|child
| group11 = Shops
| list11 =
* [[Baron's Cask]]
* [[Cask of the Lonely Drunkard]]
* [[The Copper Roost]]
* [[Delilah's Delicatessan]]
* [[Drunkard's Cask]]
* [[Jonathan's Tavern]]
* [[Kaarst Kebab Shop]]
* [[Lily's Pastries and Baked Goods]]
* [[Lion's Apothecary]]
* [[The Night Stone]]
* [[The Sunken Giant]]
* [[Tiaathque's Medicinal Remedies]]
| group12 = Wards
| list12 =
* [[Bell Ward]]
* [[Flock Ward]]
* [[Lamp Ward]]
* [[Mastaff Ward]]
* [[Rook Ward]]
* [[Outer City]]
| group13 = [[Acropolis of Kereskaa]]
| list13 =
* [[Spire of Conjuration]]
* [[Spire of Divination]]
* [[Spire of Necromancy]]
* [[Spire of Abjuration]]
* [[Spire of Evocation]]
* [[Spire of Illusion]]
* [[Spire of Enchantment]]
* [[Spire of Transmutation]]
}} <!-- End of Kaarst -->
}} <!-- End Scharn -->
}} <!-- End of Arkhellen Empire -->
}} <!-- End of Elengon -->
}} <!-- End of Talyen -->
}} <!-- End of Bodies -->
}} <!-- End -->
84085ee297b4ea392a5eb31d98298776d8ef2587
Main Page
0
1
255
1
2024-03-28T01:35:22Z
Vicht
1
Plopping the navboxes here because what could be easier
wikitext
text/x-wiki
{{Characters}}
{{Locations}}
b4bd018b2f8274edd85a1a777465ed43759ac3e4
MediaWiki:Sidebar
8
149
257
2024-03-28T21:14:54Z
Vicht
1
Created page with "* navigation ** mainpage|mainpage-description ** recentchanges-url|recentchanges ** randompage-url|randompage //** helppage|help-mediawiki * Pages ** Sessions|Sessions ** History|History ** Calendar|Calendar ** Characters|Characters ** Locations|Locations * SEARCH * TOOLBOX * LANGUAGES"
wikitext
text/x-wiki
* navigation
** mainpage|mainpage-description
** recentchanges-url|recentchanges
** randompage-url|randompage
//** helppage|help-mediawiki
* Pages
** Sessions|Sessions
** History|History
** Calendar|Calendar
** Characters|Characters
** Locations|Locations
* SEARCH
* TOOLBOX
* LANGUAGES
0b60f13687974848f9dc8fdbe8bbfcb79748947a
258
257
2024-03-28T21:16:08Z
Vicht
1
wikitext
text/x-wiki
* navigation
** mainpage|mainpage-description
** recentchanges-url|recentchanges
** randompage-url|randompage
//** helppage|help-mediawiki
* Pages
** Sessions|Sessions
** Main:History|History
** Calendar|Calendar
** Characters|Characters
** Locations|Locations
* SEARCH
* TOOLBOX
* LANGUAGES
61501fafbdc66964cba163ca45b3013db5dfcfc9
259
258
2024-03-28T21:17:15Z
Vicht
1
Changed history to timeline to avoid weird behaviour
wikitext
text/x-wiki
* navigation
** mainpage|mainpage-description
** recentchanges-url|recentchanges
** randompage-url|randompage
//** helppage|help-mediawiki
* Pages
** Sessions|Sessions
** Timeline|Timeline
** Calendar|Calendar
** Characters|Characters
** Locations|Locations
* SEARCH
* TOOLBOX
* LANGUAGES
b0fd64da0c6e87473474511862d432f3c0ce2bb1
Timeline
0
5
260
5
2024-03-28T21:18:15Z
Vicht
1
Vicht moved page [[History]] to [[Timeline]]: Was causing weird behaviour when linking to 'History' from 'MediaWiki:Sidebar'
wikitext
text/x-wiki
== Ancient history ==
* Age of Great Ruin—soul of a Great Wyrm becomes held by [[Dragon Orb of Drimysthonontas]]
* Age of Enlightenment—[[Squall's Beacon]] constructed in [[Farankaars]]
* [[Kereskaa]] contains Dragon Orb of Drimysthonontas, [[Acropolis of Kereskaa]] built above it
* A servant of [[Correlan]] gifts a [[tree from the Feywild]] to the Acropolis of Kereskaa for a good deed done
* [[Master Suithrathus Luirmo]] begins his tenure at Acropolis of Kereskaa
* Veteran of the [[Blood Wars]], [[Vastren]] is summoned into the catacomb beneath the [[Spire of ]]
* 576th year of the Age of Enlightenment—[[Teklanna Morantine]] betrays the Acropolis of Kereskaa to the [[Kytheran]]s, who destroy the Acropolis
* [[Tyrant]] rules [[Kaarst]], their statue is collapsed into the bay leaving [[Tyrant's Folly]]
* Age of Decadence—arcane magic is used for unpleasant purposes in Kaarst
* [[Great War]] between gods of good and evil for hundreds of years; flying cities used as weapons
* Thousands of years ago, Great War is ended by [[Divine Accords]]; [[Bahamut]] and [[Teli Monei]] sign
== Recent history==
; 3 generations ago
: Founding of Arkhellen Empire; 12 churches are united as [[Verein Kirche]]
; >80 years ago
: Birth of [[Maurul Silkendawn]]
; 55–59 years ago
: Birth of [[Reginald Kobolwitz]]
; 47 years ago
: Birth of [[Traulam Eugen]]
; 35 years ago
: Birth of [[Lorenzo Arkhelle]]
; 12 years ago
: [[King Lorenzo Arkhelle XVI]] becomes 3rd Emperor of the Empire
; 10 years ago
: [[Anrel]] is living in [[Kaarst]] having been raised by the church there
; <10 years ago
: [[Mirark]]'s tiefling friend disappears
; 8 years ago
: [[Amnon Ingolidan]] begins working at [[Squall's Beacon]]; [[Felosiel Teinithra]] and [[Ruda Frank]] marry
; 7 years ago
: [[Anrel]]'s last excursion [[Fuarcrùn Freeholds|north]]; he is the only survivor
; 6–7 years ago
: [[Felosiel Teinithra]] becomes captain of [[Kaarst City Watch]]
; ~5 years ago
: [[Kham]] is the only person still speaking to [[Elira Lein]]
; 3 years ago
: [[Eurgaran Wihta]] begins working at [[Squall's Beacon]]; [[Orryn Daergel]] is promoted from Private to Sergeant in [[Kaarst City Watch]]
; 2 years ago
: [[Felosiel Teinithra]] and [[Ruda Frank]] move to their current home
== 1853 Post-Accord ==
; 25 Skaerentsa
: [[Captain Adran Mokam|Captain]] and [[Thava Windreaver|boatswain]] found dead on <i class="ship">[[Hope's Prize]]</i>
; 2 months ago
: [[Beatrux]] is brought to the [[Zaheer island]] as a slave by [[gnoll]]s
; 3 weeks ago
: [[Ser Kobolwitz]]'s [[Claira Hanali|housekeeper]] leaves work to visit family in [[Salzreich]]
; Early Maneseed
: [[Valiant Morgen Trading Company]] purchases a [[Valiant Morgen Trading Company warehouse|warehouse]]
; 19 Maneseed
: Last sighting of [[Father Traulam Eugen]]
; 3 Thirkuoss
: [[Ser Kobolwitz]]'s body found in his [[Kobolwitz Manor|manor]] drawing room
; 10 Thirkuoss
: [[Thodris Holderhek]]'s body found in [[Sombre Lyceum]]
; 15 Thirkuoss
: [[Eurgaran Wihta]] leaves home but does not arrive at [[Squall's Beacon]]
; 17 Thirkuoss
: [[Eurgaran Wihta]]'s body found floating in harbour
; 25 Thirkuoss
: Party arrives at [[gnoll]] camp in [[Aleph Marsh]]
; 26 Thirkuoss
: Slaves are freed from [[gnoll]] camp and sail to [[Meeresdorf]]
; 27 Thirkuoss
: Party arrives on the [[Zaheer island|island]] and escapes the slave camp
; 28 Thirkuoss
: Party meets ghosts and [[troglodyte|lizard-type folk]] in the [[Zaheer island|island]] caves
; 29 Thirkuoss
: [[Srir Silthallow]] is defeated but [[Rrekkeh Stormcrawler]] escapes
; 30 Thirkuoss
: Survivors leave the [[Zaheer island|island]] aboard <i class="ship">[[Dancing in the Storm]]</i>
; 31 Thirkuoss
: <i class="ship">[[Dancing in the Storm]]</i> departs [[Meeresdorf]] for [[Senneborn]]
; 1 Thelliea
: <i class="ship">[[Dancing in the Storm]]</i> arrives in [[Senneborn]]; Party departs for [[Kaarst]]
; 3 Thelliea
: Last sighting of [[Captain Felosial Teinithra]] by [[Sergeant Doudra]]
; 11 Thelliea
: Party arrives in [[Kaarst]], visits [[Kade Sirrine Kathedrale]], [[Mira]] joins
; 12 Thelliea
: Party visits [[Kobolwitz Manor]] and [[Squall's Beacon]]
; 13 Thelliea
: Discovery and stakeout of [[Valiant Morgen Trading Company warehouse|Valiant Morgen warehouse]]
; 14 Thelliea
: Interrogation of captives, jailbreak of [[Uthan]], meeting [[the Tide]], investigating [[Valiant Morgen Trading Company|Valiant Morgen]]
; 15 Thelliea
: [[Sable Warden]] sends party to [[Acropolis of Karaskaa]], party stops [[Knives of Mystra]] just before sunset, meeting of [[Kaarst City Council]]
; 16 Thelliea
: <i class="ship">[[Hope's Prize]]</i> was due to depart [[Kaarst]]
23e8a8f9b20a9c1b64bc7c594966304b8050f7af
263
260
2024-03-29T19:20:23Z
Vicht
1
Fixed spelling of Correlon and link to feywild tree
wikitext
text/x-wiki
== Ancient history ==
* Age of Great Ruin—soul of a Great Wyrm becomes held by [[Dragon Orb of Drimysthonontas]]
* Age of Enlightenment—[[Squall's Beacon]] constructed in [[Farankaars]]
* [[Kereskaa]] contains Dragon Orb of Drimysthonontas, [[Acropolis of Kereskaa]] built above it
* A servant of [[Corellon]] gifts a [[feywild tree|tree from the Feywild]] to the Acropolis of Kereskaa for ‘a good deed done’
* [[Master Suithrathus Luirmo]] begins his tenure at Acropolis of Kereskaa
* Veteran of the [[Blood Wars]], [[Vastren]] is summoned into the catacomb beneath the [[Spire of ]]
* 576th year of the Age of Enlightenment—[[Teklanna Morantine]] betrays the Acropolis of Kereskaa to the [[Kytheran]]s, who destroy the Acropolis
* [[Tyrant]] rules [[Kaarst]], their statue is collapsed into the bay leaving [[Tyrant's Folly]]
* Age of Decadence—arcane magic is used for unpleasant purposes in Kaarst
* [[Great War]] between gods of good and evil for hundreds of years; flying cities used as weapons
* Thousands of years ago, Great War is ended by [[Divine Accords]]; [[Bahamut]] and [[Teli Monei]] sign
== Recent history==
; 3 generations ago
: Founding of Arkhellen Empire; 12 churches are united as [[Verein Kirche]]
; >80 years ago
: Birth of [[Maurul Silkendawn]]
; 55–59 years ago
: Birth of [[Reginald Kobolwitz]]
; 47 years ago
: Birth of [[Traulam Eugen]]
; 35 years ago
: Birth of [[Lorenzo Arkhelle]]
; 12 years ago
: [[King Lorenzo Arkhelle XVI]] becomes 3rd Emperor of the Empire
; 10 years ago
: [[Anrel]] is living in [[Kaarst]] having been raised by the church there
; <10 years ago
: [[Mirark]]'s tiefling friend disappears
; 8 years ago
: [[Amnon Ingolidan]] begins working at [[Squall's Beacon]]; [[Felosiel Teinithra]] and [[Ruda Frank]] marry
; 7 years ago
: [[Anrel]]'s last excursion [[Fuarcrùn Freeholds|north]]; he is the only survivor
; 6–7 years ago
: [[Felosiel Teinithra]] becomes captain of [[Kaarst City Watch]]
; ~5 years ago
: [[Kham]] is the only person still speaking to [[Elira Lein]]
; 3 years ago
: [[Eurgaran Wihta]] begins working at [[Squall's Beacon]]; [[Orryn Daergel]] is promoted from Private to Sergeant in [[Kaarst City Watch]]
; 2 years ago
: [[Felosiel Teinithra]] and [[Ruda Frank]] move to their current home
== 1853 Post-Accord ==
; 25 Skaerentsa
: [[Captain Adran Mokam|Captain]] and [[Thava Windreaver|boatswain]] found dead on <i class="ship">[[Hope's Prize]]</i>
; 2 months ago
: [[Beatrux]] is brought to the [[Zaheer island]] as a slave by [[gnoll]]s
; 3 weeks ago
: [[Ser Kobolwitz]]'s [[Claira Hanali|housekeeper]] leaves work to visit family in [[Salzreich]]
; Early Maneseed
: [[Valiant Morgen Trading Company]] purchases a [[Valiant Morgen Trading Company warehouse|warehouse]]
; 19 Maneseed
: Last sighting of [[Father Traulam Eugen]]
; 3 Thirkuoss
: [[Ser Kobolwitz]]'s body found in his [[Kobolwitz Manor|manor]] drawing room
; 10 Thirkuoss
: [[Thodris Holderhek]]'s body found in [[Sombre Lyceum]]
; 15 Thirkuoss
: [[Eurgaran Wihta]] leaves home but does not arrive at [[Squall's Beacon]]
; 17 Thirkuoss
: [[Eurgaran Wihta]]'s body found floating in harbour
; 25 Thirkuoss
: Party arrives at [[gnoll]] camp in [[Aleph Marsh]]
; 26 Thirkuoss
: Slaves are freed from [[gnoll]] camp and sail to [[Meeresdorf]]
; 27 Thirkuoss
: Party arrives on the [[Zaheer island|island]] and escapes the slave camp
; 28 Thirkuoss
: Party meets ghosts and [[troglodyte|lizard-type folk]] in the [[Zaheer island|island]] caves
; 29 Thirkuoss
: [[Srir Silthallow]] is defeated but [[Rrekkeh Stormcrawler]] escapes
; 30 Thirkuoss
: Survivors leave the [[Zaheer island|island]] aboard <i class="ship">[[Dancing in the Storm]]</i>
; 31 Thirkuoss
: <i class="ship">[[Dancing in the Storm]]</i> departs [[Meeresdorf]] for [[Senneborn]]
; 1 Thelliea
: <i class="ship">[[Dancing in the Storm]]</i> arrives in [[Senneborn]]; Party departs for [[Kaarst]]
; 3 Thelliea
: Last sighting of [[Captain Felosial Teinithra]] by [[Sergeant Doudra]]
; 11 Thelliea
: Party arrives in [[Kaarst]], visits [[Kade Sirrine Kathedrale]], [[Mira]] joins
; 12 Thelliea
: Party visits [[Kobolwitz Manor]] and [[Squall's Beacon]]
; 13 Thelliea
: Discovery and stakeout of [[Valiant Morgen Trading Company warehouse|Valiant Morgen warehouse]]
; 14 Thelliea
: Interrogation of captives, jailbreak of [[Uthan]], meeting [[the Tide]], investigating [[Valiant Morgen Trading Company|Valiant Morgen]]
; 15 Thelliea
: [[Sable Warden]] sends party to [[Acropolis of Karaskaa]], party stops [[Knives of Mystra]] just before sunset, meeting of [[Kaarst City Council]]
; 16 Thelliea
: <i class="ship">[[Hope's Prize]]</i> was due to depart [[Kaarst]]
9480aba66e050e2afed22dd0e7788e4a2b665b92
History
0
150
261
2024-03-28T21:18:15Z
Vicht
1
Vicht moved page [[History]] to [[Timeline]]: Was causing weird behaviour when linking to 'History' from 'MediaWiki:Sidebar'
wikitext
text/x-wiki
#REDIRECT [[Timeline]]
3857bcb26fc90ef60dc535f69187c3b34a945349
Seventh Altar
0
151
265
2024-03-30T01:32:46Z
Vicht
1
Redirected page to [[Spire of Evocation]]
wikitext
text/x-wiki
#REDIRECT [[Spire of Evocation]]
80a9a855d28f6e339bc4158857b5a868f80250a1
Altar of Transmutation
0
152
266
2024-03-30T01:33:53Z
Vicht
1
Redirected page to [[Spire of Transmutation]]
wikitext
text/x-wiki
#REDIRECT [[Spire of Transmutation]]
b09bf6dbe7618290619a7d1a65ee2d61fda77066
Altar of Conjuration
0
153
267
2024-03-30T01:34:23Z
Vicht
1
Redirected page to [[Spire of Conjuration]]
wikitext
text/x-wiki
#REDIRECT [[Spire of Conjuration]]
adce2a316ce066474ccb2f31ca396ea62c9ea3ce
Altar of Divination
0
154
268
2024-03-30T01:35:24Z
Vicht
1
Redirected page to [[Spire of Divination]]
wikitext
text/x-wiki
#REDIRECT [[Spire of Divination]]
dfa2777db150e92d12cf7c70037254cedc3de17f
Altar of Necromancy
0
155
269
2024-03-30T01:35:49Z
Vicht
1
Redirected page to [[Spire of Necromancy]]
wikitext
text/x-wiki
#REDIRECT [[Spire of Necromancy]]
eea71989bc21a74bea6458f47ba712f44a4a0cb9
Altar of Abjuration
0
156
270
2024-03-30T01:36:11Z
Vicht
1
Redirected page to [[Spire of Abjuration]]
wikitext
text/x-wiki
#REDIRECT [[Spire of Abjuration]]
f581bd3d1950ad72f64fac4e8f8b0d5dddbe3cd5
Altar of Evocation
0
157
271
2024-03-30T01:36:41Z
Vicht
1
Redirected page to [[Spire of Evocation]]
wikitext
text/x-wiki
#REDIRECT [[Spire of Evocation]]
80a9a855d28f6e339bc4158857b5a868f80250a1
Altar of Illusion
0
158
272
2024-03-30T01:37:06Z
Vicht
1
Redirected page to [[Spire of Illusion]]
wikitext
text/x-wiki
#REDIRECT [[Spire of Illusion]]
a5f6ea4d01804dab0256f69582e39a5ecc21bb94
Altar of Enchantment
0
159
273
2024-03-30T01:37:30Z
Vicht
1
Redirected page to [[Spire of Enchantment]]
wikitext
text/x-wiki
#REDIRECT [[Spire of Enchantment]]
31070e8ce57fbfb35ba8a50d7330b228f024e566
Corellon
0
160
274
2024-03-30T01:40:46Z
Vicht
1
Created page with "An [[elf|elven]] figure, a servant of whom presented the [[Acropolis of Kereskaa]] with a [[feywild tree|tree]] for its Orchard as thanks for ‘a good deed done,’ before the time of [[Master Suithrathus Luirmo]]'s tenure. [[Category:Gods]]"
wikitext
text/x-wiki
An [[elf|elven]] figure, a servant of whom presented the [[Acropolis of Kereskaa]] with a [[feywild tree|tree]] for its Orchard as thanks for ‘a good deed done,’ before the time of [[Master Suithrathus Luirmo]]'s tenure.
[[Category:Gods]]
2eba6af19d8e1ab99b0d8837fe27253c04da3b77
Acropolis of Kereskaa
0
161
275
2024-03-30T15:22:32Z
Vicht
1
Created page with "The <dfn><b>Acropolis of Kereskaa</b></dfn> was an institute for the study of magic and a stronghold for dangerous magical artefacts. It was destroyed in the 576th year of the [[Timeline|Age of Enlightenment]], split in half and abandoned in an underground chamber far beneath [[Kaarst]]. In [[Timeline|1853 Post-Accord]], it was used by the [[Knives of Mystra]] for the manufacture of [[ashfire oil]] until their planned attack was interrupted by [[Grokko]], [[Kham]], Mir..."
wikitext
text/x-wiki
The <dfn><b>Acropolis of Kereskaa</b></dfn> was an institute for the study of magic and a stronghold for dangerous magical artefacts. It was destroyed in the 576th year of the [[Timeline|Age of Enlightenment]], split in half and abandoned in an underground chamber far beneath [[Kaarst]]. In [[Timeline|1853 Post-Accord]], it was used by the [[Knives of Mystra]] for the manufacture of [[ashfire oil]] until their planned attack was interrupted by [[Grokko]], [[Kham]], [[Mira]] and [[Vichthart]].
== Early history ==
According to [[Suithrathus Luirmo]], the Acropolis was built on the site where Kereskaa and her most devoted followers contained the [[Dragon Orb of Drimysthonontas]]. It later also contained the [[Obsidian Claw]] and a [[third artefact]] (so tempting that Master Luirmo refused to describe its power), kept in a vault and behind doors that required multiple [[Seal]]s to unlock and guarded by giant constructs of metal and wood. Above this was built the central structure and its eight spires used by the Masters and their students.
The Acropolis was located in the city of [[Kaarst|Farankaars]], although it is not known which existed first.
Suithrathus Luirmo described how students would travel to the Acropolis from all over [[Elengon]]. Judging by their skeletal remains, they were mostly older teenagers, and a significant proportion of them were [[dragonborn]]. The students dined in the Great Hall and attended lectures and demonstrations in the Amphitheatre. The Orchard of the Acropolis was where students and faculty relaxed, the central [[feywild tree|tree]] of which had been a gift to the Acropolis from the [[Fey]] before Luirmo's tenure.
=== Masters ===
The Masters (and Mistresses) were the leading teachers of the Acropolis, with each of them specializing in a particular school of magic, and residing and working in the corresponding Spire. According to Suithrathus, the Masters did not share with each other what they were working on in their respective catacombs. However, Elgrex Anderra left a recorded message that seemed to be addressed to an unknown lover, almost certainly another of the Masters.
The Masters at the time of the Acropolis's destruction were as follows.
{| class="wikitable"
! scope="col" | Name
! scope="col" | School
! scope="col" | Description
|-
| [[Elgrex Anderra]]
| [[Abjuration]]
| A brass dragonborn woman
|-
| [[Cansa Cinsmic]]
| [[Conjuration]]
| A [[gnome]] woman with a friendly expression
|-
| [[Befrir Dalovamri]]
| [[Enchantment]]
| A [[dwarf|dwarven]] man with an impassive but soft expression, and jewellery woven into his beard
|-
| [[Suithrathus Luirmo]]
| [[Divination]]
| A broad and bulky green [[dragonborn]] man with a stern expression
|-
| [[Teklanna Morantine]]
| [[Necromancy]]
| A [[human]] woman
|-
| [[Farlu Naenreh]]
| [[Illusion]]
| An androgenous [[drow]] with a smug smile, usually depicted with poorly defined features
|-
| [[Toross Rhistel]]
| [[Transmutation]]
| A tall [[elf|elven]] man with an aloof expression
|-
| [[Vithra Rutgeth]]
| [[Evocation]]
| A muscular gold dragonborn man
|-
|}
=== Destruction ===
Suithrathus learnt that the [[Kythera]]ns, the population of a [[flying city]] to which he'd previously visited, had come to desire an object entrusted to the Acropolis, possibly the [[Dragon Orb of Drimysthonontas]]. He was trying to divine their intentions in his Hall of Prophecies when they attacked, aided by a traitor. Suithrathus survived by transferring his mind into his black quartz divining mirror, and Elgrex Anderra was kept safe inside the [[Spire of Abjuration]]. Trapped in there, Elgrex was able to hear Teklanna Morantine speaking to unfamiliar voices in the corridor outside, and determined she was the traitor. Suithrathus would later discover that the Dragon Orb of Drimysthonontas had been taken from the vault using Morantine's [[Seal]].
Another survivor of the initial attack was a tall elven figure who became trapped inside the mirror contraption in the catacomb of the [[Spire of Transmutation]], likely Toross Rhistel; however, unable to leave, he expired inside his invention. Large numbers of skeletons of the students were left in the Great Hall and the student dormitories, which had scratch marks on the insides of the doors.
Either as part of the attack or at some subsequent time, the Acropolis itself was moved into an underground chamber, and was split into two parts down its middle. The [[Spire of Necromancy]] collapsed onto its side, connecting the two halves of the Acropolis. The plantlife in the Orchard became petrified, although the [[feywild tree]] kept itself and nearby plants alive.
== Architecture ==
The Acropolis was a large octagonal stone building with eight octagonal spires located on its edges. The entrance to the main building was by a single door at ground level on the western corner, between the [[Spire of Transmutation|Spires of Transmutation]] and [[Spire of Enchantment|Enchantment]]. This lead directly into the outer corridor which ran around the entire circumference of the ground floor, as well as to a straight corridor leading by double doors into the floor of the Amphitheatre. Between the central Amphitheatre and the outer corridor were a ring of rooms: the Grand Library, the Great Hall and its kitchen, and a set of student dormitories.
=== Grand Library ===
Occupying the entire northwestern quarter of the ground floor between the Amphitheatre and the outer corridor, in a wide chevron shape, the Grand Library has an entrance into the corridor at both its northeastern and southwestern ends. Originally it would have been filled with tomes of magical knowledge, none of which were inherantly magical. However, when the party explores the Acropolis, the room is filled only with ash, and the northern quarter of the room was separated by a huge fissure (although nothing compared to the fissue between the two halves of the Acropolis). The only surviving item was a charred, rusted and grimy chest, as well as its contents: a small collection of [[leatherbound books]]. [[Vichthart]] secures most of these in the [[Bag of Holding]], although he hands one to [[Mira]] when the [[twinned red flame book|twinned red flame]] on its cover catches his attention and he requests it.
=== Great Hall ===
The Great Hall is the dining room in the northeast quarter of the ground floor of the Acropolis, between the Amphitheatre and the outer corridor. It contains a fireplace and dining tables. Many students were in the Great Hall when the Acropolis was attacked, and their skeletons remained sheltering underneath tables when the party were exploring the ruins, leading the party to wonder why no one had ever removed them. These skeletons were visibly older teenagers, and included a significant number of [[dragonborn]]. The party wondered why nobody had ever cleared out the bodies. The Great Hall connected to the octagonal corridor, as well as to a kitchen adjoining it, which itself connected to the outer corridor.
=== Amphitheatre ===
The amphitheatre is where lessons and demonstrations take place for students. It is surrounded by seating that looks down on its circular floor, and is located at the very centre of the Acropolis. Around its inside wall are eight alcoves housing statues of the current Masters of the Acropolis, spaced evenly around the circumference. Between many pairs of the statues are short phrases carved into the wall in a language Mira doesn't recognize (but can read using his [[Eyes of the Runekeeper]]).
When the party explained to Master Luirmo that they needed to reach the Altar of Evocation, not knowing the current condition of the Acropolis, he first suggested that they travel via the Amphitheatre, it being central to the building on the floor that all spires connect to the main building. Unfortunately, when the Acropolis split down its middle, so too was the Amphitheatre, preventing it from leading to the Spire of Evocation. The statues of Befrir Dalovamri to Suithrathus Luirmo remained on the northern side of the fissure, where Mira first used his [[levitation]] to scout alone and read the phrases on the wall. The statues of Elgrex Anderra to Farlu Naenreh (as well as the alcove where the statue of Teklanna Morantine would have stood) remained on the southern side, but when the party reached the southern half, Mira did not take note of the remaining phrases on the walls.
<!-- Double check that the empty alcove is not actually located between Suithrathus Luirmo and Elgrex Anderra, as the statues are all otherwise in the same positions as their respective spires. -->
{| class="wikitable"
! scope="col" | Direction
! scope="col" | Master
! scope="col" | School
! scope="col" | Depiction
|-
| West-northwest
| [[Toross Rhistel]]
| [[Transmutation]]
| Tall elven man with an aloof expression and holding one hand aloft in an open-palmed gesture
|-
| colspan="4" style="text-align:center" | ‘Seven stars light the night sky’
|-
| North-northwest
| [[Cansa Cinsmic]]
| [[Conjuration]]
| Gnome woman with a friendly expression, hands behind her back, one foot forward
|-
| colspan="4" style="text-align:center" | ‘Seven eyes perceive what hides’
|-
| North-northeast
| [[Suithrathus Luirmo]]
| [[Divination]]
| Broad and bulky dragonborn, holding an orb at chest height in front of him, with a stern expression
|-
| colspan="4" style="text-align:center" | ‘Seven hearts yearn for—’
|-
| East-northeast
| [[Elgrex Anderra]]
| [[Abjuration]]
| Feminine dragonborn
|-
| colspan="4" style="text-align:center" | <i>Not examined</i>
|-
| East-southeast
| [[Vithra Rutgeth]]
| [[Evocation]]
| Muscular dragonborn man
|-
| colspan="4" style="text-align:center" | <i>Not examined</i>
|-
| South-southeast
| [[Farlu Naenreh]]
| [[Illusion]]
| Drow, not just androgenous but with poorly defined features and a smug smile
|-
| colspan="4" style="text-align:center" | <i>Not examined</i>
|-
| South-southwest
| [[Teklanna Morantine]]
| [[Necromancy]]
| Missing from the amphitheatre having been moved to the collapsed [[Spire of Necromancy]]
|-
| colspan="4" style="text-align:center" | <i>Not examined</i>
|-
| West-southwest
| [[Befrir Dalovamri]]
| [[Enchantment]]
| Dwarven man with a thick beard with jewellery woven in, and an impassive but soft expression
|-
| colspan="4" style="text-align:center" | <i>Entranceway, no phrase</i>
|-
|}
A longer passage runs around the entire wall underneath the statues, much more spaced out than the other phrases. Again, Mira only read the start of the phrase on the northern half of the Acropolis, which reads ‘Seven stars and seven—’.
=== Spires ===
There were eight spires located around the periphery of the Acropolis. Each spire was divided into an equal number of storeys, being taller than the central structure of the Acropolis, each with a similar floorplan. The topmost floors were living quarters for each of the Masters. Below those were chambers containing the Altars of the respective schools of magic, each altar resembling a 10-foot wide sculpture of white gold. The patterns of each altar resembled those on each of the Master's [[Seal]]s, as used in conjunction they amplified the magic of their respective schools.
Below the altar rooms were the atria connecting each spire to the central building, on the same level as the Grand Library, Great Hall, student dormitories and the floor of the Amphitheatre. On the floor below this, each spire was connected by catacombs, which held a unique chamber for each Master. For example, the chamber underneath the Spire of Divination was called the Hall of Prophecies, while underneath the Spire of Evocation was a firing range for spellcasters to practise their aim.
{| class="wikitable"
! scope="col" | Direction
! scope="col" | School
! scope="col" | Catacomb
|-
| West-northwest
| [[Spire of Transmutation]]
| Mirror device
|-
| North-northwest
| [[Spire of Conjuration]]
| [[Vastren]]
|-
| North-northeast
| [[Spire of Divination]]
| Hall of Prophecies
|-
| East-northeast
| [[Spire of Necromancy]]
|
|-
| East-southeast
| [[Spire of Abjuration]]
| Passage under [[Kade Sirrine Kathedrale|cathedral]]
|-
| South-southeast
| [[Spire of Evocation]]
| Firing range
|-
| South-southwest
| [[Spire of Illusion]]
| Farlu's bust puzzle
|-
| West-southwest
| [[Spire of Enchantment]]
| [[Spiderweb shield]]
|}
=== Orchard ===
Outside the Acropolis building was a large outdoor area filled with grass, flowers, and trees, as well as a stream of water that flowed north to south. One of these trees was a gift from the [[Fey]] before Master Luirmo's tenure, specifically from a servant of [[Corellon]] as thanks for ‘a good deed done.’ This orchard was teleported along with the building, ending up in an underground cavern. Somehow, the plantlife of the orchard became petrified, which Master Luirmo was not able to attribute to the time it spent underground. When walking through the petrified orchard, Grokko alone could hear many overlapped whispered voices, which became clearer as he approached the [[Feywild tree]], saying things like ‘How much time?’ and ‘The pain!’ in a language Grokko doesn't recognize but can understand.
The tree gifted by the Fey is the largest in the orchard, with many roots exposed above the ground, and despite the attack on the Acropolis and the passage of time, has not only remained alive, but also kept some nearby grass and flowers clinging to life. Suithrathus speculates that this is caused by some form of fey magic. As Grokko nears the Feywild tree, he begins being able to communicate with it in [[Sylvan]]. It describes itself as being trapped and wounded by a stone far to the southwest, and offers its life to provide Grokko with its [[ruby red apple]], which it claims will heal the damage done to the [[Feywild]]. When Grokko picks the apple, the tree dies and the surrounding vegetation begins to wilt.
== Later history ==
The journal of [[Irann Rhogar]] describes how he and [[Etorn Hadaran]] explored the sewers of Kaarst and eventually made a significant discovery, that presumably being the Acropolis or certain of its contents. Of all the contents of the Acropolis, Rhogar and Hadaran made use of several rooms and entities.
* The [[Spire of Conjuration]] contained a teleportation circle to which Rhogar could travel via a similar circle in [[Irann Rhogar's house|his house]].
* The catacombs below the Spire of Conjuration held [[Vastren]], a captive devil summoned by the students of [[Conjuration]] before the Acropolis was attacked, who had remained trapped ever since. Rhogar made an unknown deal with Vastren, the specifics of which are not known. However, several devils did fight to defend the [[Knives of Mystra]], which may have been related to the deal made.
* The collapsed [[Spire of Necromancy]] was used as a bridge to reach the [[Spire of Abjuration]], as well as a chokepoint to guard against anyone who came after them.
* The Altar of [[Evocation]] was used by [[Leagallow Tiaathque]] to manufacture [[ashfire oil]]. They refered to it as the ‘Seventh Altar’.
* The [[Spire of Abjuration]]'s secondary function as a stronghold in case the Acropolis is attacked was used to barriade intruders from accessing the planned point of detonating the ashfire oil.
[[Category:Ancient ruins]]
[[Category:Locations in Kaarst]]
63f6ecae29237956dfc227c923adc4080e80fce5
Gruumsch
0
162
276
2024-03-30T18:49:26Z
Vicht
1
Created page with "[[Orc]]ish god of war worshipped by the [[demon]]-summoning [[gnoll]]s that invaded [[Western Scharn]]. In the caves beneath the [[gnoll camp]], [[Grokko]] discovered and desecrated an altar that had originally been dwarven before gnolls repurposed it by hanging a bone trinket by a nail from the wall above the altar. The altar was located up a dead end, but the fact that there were fresh sacrifices on the altar indicated that gnolls travelled its length and therefore it..."
wikitext
text/x-wiki
[[Orc]]ish god of war worshipped by the [[demon]]-summoning [[gnoll]]s that invaded [[Western Scharn]]. In the caves beneath the [[gnoll camp]], [[Grokko]] discovered and desecrated an altar that had originally been dwarven before gnolls repurposed it by hanging a bone trinket by a nail from the wall above the altar. The altar was located up a dead end, but the fact that there were fresh sacrifices on the altar indicated that gnolls travelled its length and therefore it wouldn't be safe for the party to rest there.
After Grokko defaced the altar by attaching one of his jars of preserved fish, it was detectable by Kham's [[Detect Evil and Good]].
[[Category:Gods]]
5bc6b565513f4344bbcb3372e616cd944383f542
277
276
2024-03-30T18:50:32Z
Vicht
1
Added link to Kham
wikitext
text/x-wiki
[[Orc]]ish god of war worshipped by the [[demon]]-summoning [[gnoll]]s that invaded [[Western Scharn]]. In the caves beneath the [[gnoll camp]], [[Grokko]] discovered and desecrated an altar that had originally been dwarven before gnolls repurposed it by hanging a bone trinket by a nail from the wall above the altar. The altar was located up a dead end, but the fact that there were fresh sacrifices on the altar indicated that gnolls travelled its length and therefore it wouldn't be safe for the party to rest there.
After Grokko defaced the altar by attaching one of his jars of preserved fish, it was detectable by [[Kham]]'s [[Detect Evil and Good]].
[[Category:Gods]]
e0c151fb5e3112b317f8df11eb0e30abeab03a92
File:Spiderweb Shield.jpg
6
163
278
2024-03-30T20:08:40Z
Vicht
1
The [[Spiderweb Shield]] picked up by [[Vichthart]] from the [[Spire of Enchantment]]
wikitext
text/x-wiki
== Summary ==
The [[Spiderweb Shield]] picked up by [[Vichthart]] from the [[Spire of Enchantment]]
856910f9f7bc2eb0875fe5f77f55f9a846f2463a
Spiderweb shield
0
164
279
2024-03-31T01:25:41Z
Vicht
1
Created page with "A shield shaped as an artistic representation of a spiderweb, which acts like a normal shield but also grants its bearer resistance to damage from ranged weapon attacks. It is currently equipped by [[Vichthart]]. [[File:Spiderweb Shield.jpg|thumb|center|upright=1|Spiderweb Shield]] This shield was first found in the catacomb beneath the [[Spire of Enchantment]], where [[Suithrathus Luirmo]] was unable to identify it, only supposing that it was a student project or an i..."
wikitext
text/x-wiki
A shield shaped as an artistic representation of a spiderweb, which acts like a normal shield but also grants its bearer resistance to damage from ranged weapon attacks. It is currently equipped by [[Vichthart]].
[[File:Spiderweb Shield.jpg|thumb|center|upright=1|Spiderweb Shield]]
This shield was first found in the catacomb beneath the [[Spire of Enchantment]], where [[Suithrathus Luirmo]] was unable to identify it, only supposing that it was a student project or an item in the process of being enchanted. Not knowing if it's dangerous, [[Kham]] insists that [[Mira]] is kept from touching it as he instinctively try to do. [[Grokko]] obliges by standing between Mira and the shield but, misunderstanding the cause for concern, touches the shield anyway to determine if it will fit in the [[Bag of Holding]]. He finds that the shield is too large for the bag's 2-foot opening, but also feels that the item is warm to the touch, meaning it is likely already enchanted.
Mira argues that it may be useful in their efforts to stop the [[Knives of Mystra]] from detonating the [[ashfire oil]] underneath [[Kade Sirrine Kathedrale]], which convinces Vichthart to collect the item, but instead of immediately equipping it, he lashes it to his backpack for later inspection.
The party later takes a short rest after retrieving the [[Obsidian Claw]] from the vault of the [[Acropolis of Kereskaa|Acropolis]], and before using it to enter the [[Spire of Abjuration]]. During this time, Vichthart focuses on the shield to determines its properties, and begins to use it instead of his previous shield.
81971fa320564695cfe3c267f39a779d524bd173
282
279
2024-03-31T12:32:41Z
Vicht
1
Added Category:Items held by Vichthart
wikitext
text/x-wiki
A shield shaped as an artistic representation of a spiderweb, which acts like a normal shield but also grants its bearer resistance to damage from ranged weapon attacks. It is currently equipped by [[Vichthart]].
[[File:Spiderweb Shield.jpg|thumb|center|upright=1|Spiderweb Shield]]
This shield was first found in the catacomb beneath the [[Spire of Enchantment]], where [[Suithrathus Luirmo]] was unable to identify it, only supposing that it was a student project or an item in the process of being enchanted. Not knowing if it's dangerous, [[Kham]] insists that [[Mira]] is kept from touching it as he instinctively try to do. [[Grokko]] obliges by standing between Mira and the shield but, misunderstanding the cause for concern, touches the shield anyway to determine if it will fit in the [[Bag of Holding]]. He finds that the shield is too large for the bag's 2-foot opening, but also feels that the item is warm to the touch, meaning it is likely already enchanted.
Mira argues that it may be useful in their efforts to stop the [[Knives of Mystra]] from detonating the [[ashfire oil]] underneath [[Kade Sirrine Kathedrale]], which convinces Vichthart to collect the item, but instead of immediately equipping it, he lashes it to his backpack for later inspection.
The party later takes a short rest after retrieving the [[Obsidian Claw]] from the vault of the [[Acropolis of Kereskaa|Acropolis]], and before using it to enter the [[Spire of Abjuration]]. During this time, Vichthart focuses on the shield to determines its properties, and begins to use it instead of his previous shield.
[[Category:Items held by Vichthart]]
3adb77ee21aea27bf0af2e56812123a836a86000
File:Bag of holding.jpg
6
165
280
2024-03-31T11:57:11Z
Vicht
1
The [[Bag of Holding]], which has been held by [[Grokko]], [[Kham]] and [[Vichthart]].
wikitext
text/x-wiki
== Summary ==
The [[Bag of Holding]], which has been held by [[Grokko]], [[Kham]] and [[Vichthart]].
4cd07ce7f495894a73e5a05b5f6222e9af784d50
Bag of Holding
0
166
281
2024-03-31T12:32:02Z
Vicht
1
Created page with "Found in a wooden chest in the small bedroom off the [[gnoll]]s’ bunkroom on the [[Zaheer island|island of Zaheer]]. [[Kham]] recognises it and has fun explaining its properties and dangers to [[Grokko]], who keeps it and keeps things inside it. When turned inside out it is found to already contain a [[set of silverware]], a [[pair of bone dice]], a [[potion of healing]], a [[black pearl]] and an exquisite wooden [[harp]]. All of these are returned to the bag, which is..."
wikitext
text/x-wiki
Found in a wooden chest in the small bedroom off the [[gnoll]]s’ bunkroom on the [[Zaheer island|island of Zaheer]]. [[Kham]] recognises it and has fun explaining its properties and dangers to [[Grokko]], who keeps it and keeps things inside it. When turned inside out it is found to already contain a [[set of silverware]], a [[pair of bone dice]], a [[potion of healing]], a [[black pearl]] and an exquisite wooden [[harp]]. All of these are returned to the bag, which is kept by Grokko, except the potion of healing, which Grokko gives to Kham.
[[File:Bag of holding.jpg|thumb|center|upright=1|Bag of holding]]
Grokko eventually grows tired of being the party's caddy and hands the bag to Kham. When [[Vichthart]] goes to meet the [[Sable Warden]] to tell her about [[vamper]]s aboard <i class="ship">[[Hope's Prize]]</i> and in [[Valiant Morgen Trading Company Kaarst Branch]], he takes the bag from Kham so he can access its contents for any evidence he needs, since Kham won't enter [[Kade Sirrine Kathedrale]].
The Bag of Holding currently holds
* [[Set of silverware]]
* [[Pair of bone dice]]
* [[Black pearl]]
* [[Harp]]
* Bag of [[magic beads]]
* [[Alchemy jug]]
* [[Journal of Irann Rhogar]]
* [[Sphere of thick glass]]
* [[Drift globe]]?
* [[Vial of magical conduit]]
* [[Leatherbound books]]
The Bag of Holding was also used to hold the [[Feywild shard]], since its ringing gave Grokko a headache.
[[Category:Items held by Vichthart]]
9421fe400404576dc63db060482a495bf21de4f5
Flat-bottomed ruby
0
167
283
2024-03-31T12:48:39Z
Vicht
1
Created page with "An impressive cut ruby with a flat bottom, found on the desk of [[Irann Rhogar]] in the [[Valiant Morgen Trading Company Kaarst Branch]]. Looking through it is the only known way to read [[Irann Rhogar's journal]], which otherwise appears blank. [[Vichthart]] tried to use it to find other hidden writings in the offices, but not seeing anything passed it to [[Kham]]. Vichthart requests it back when investigating the bedroom of the [[Nothing]]s, but it again reveals noth..."
wikitext
text/x-wiki
An impressive cut ruby with a flat bottom, found on the desk of [[Irann Rhogar]] in the [[Valiant Morgen Trading Company Kaarst Branch]]. Looking through it is the only known way to read [[Irann Rhogar's journal]], which otherwise appears blank.
[[Vichthart]] tried to use it to find other hidden writings in the offices, but not seeing anything passed it to [[Kham]]. Vichthart requests it back when investigating the bedroom of the [[Nothing]]s, but it again reveals nothing, and he holds onto the ruby.
[[Category:Items held by Vichthart]]
9d279293078f29a55ac31c7cdfcbadb3adac97db
284
283
2024-03-31T12:50:15Z
Vicht
1
Reworded Rhogar's journal and link
wikitext
text/x-wiki
An impressive cut ruby with a flat bottom, found on the desk of [[Irann Rhogar]] in the [[Valiant Morgen Trading Company Kaarst Branch]]. Looking through it is the only known way to read [[journal of Irann Rhogar]], which otherwise appears blank.
[[Vichthart]] tried to use it to find other hidden writings in the offices, but not seeing anything passed it to [[Kham]]. Vichthart requests it back when investigating the bedroom of the [[Nothing]]s, but it again reveals nothing, and he holds onto the ruby.
[[Category:Items held by Vichthart]]
578642af98c212d69ba869f3be6c5296d331465c
286
284
2024-03-31T13:19:20Z
Vicht
1
Added further description
wikitext
text/x-wiki
An impressive cut ruby with a flat bottom, found on the desk of [[Irann Rhogar]] in the [[Valiant Morgen Trading Company Kaarst Branch]]. It catches the moonlight in a very pleasing manner, and the colour of it is slightly too apparent for the level of darkness at which the party was exploring the building. Looking through it is the only known way to read [[journal of Irann Rhogar]], which otherwise appears blank.
[[Vichthart]] tried to use it to find other hidden writings in the offices, but not seeing anything passed it to [[Kham]]. Vichthart requests it back when investigating the bedroom of the [[Nothing]]s, but it again reveals nothing, and he holds onto the ruby.
[[Category:Items held by Vichthart]]
cddba1fff1da7e23d6aed93171ca7b69b71b9b64
Journal of Irann Rhogar
0
168
285
2024-03-31T13:17:56Z
Vicht
1
Created page with "A journal kept by [[Irann Rhogar]] and stored in a hidden compartment at the back of one of his desk drawers in the [[Valiant Morgen Trading Company Kaarst Branch]]. It is a handsome leatherbound journal, old and dogeared although its pages appear empty. Its writing can only be discerned by looking through the [[flat-bottomed ruby]] kept as a decoration on Rhogar's desk. Using the flat-bottomed ruby, [[Mira]] skimmed the journal, reading certain parts out to [[Kham]], [..."
wikitext
text/x-wiki
A journal kept by [[Irann Rhogar]] and stored in a hidden compartment at the back of one of his desk drawers in the [[Valiant Morgen Trading Company Kaarst Branch]]. It is a handsome leatherbound journal, old and dogeared although its pages appear empty. Its writing can only be discerned by looking through the [[flat-bottomed ruby]] kept as a decoration on Rhogar's desk.
Using the flat-bottomed ruby, [[Mira]] skimmed the journal, reading certain parts out to [[Kham]], [[Vichthart]] and [[Orianna]].
Rhogar's personal journal goes back several years to when Rhogar's company was called Irann Promise Trading, when business was slow and he had few clientelle, and the company was merely surviving. Rhogar wanted to grow the business bigger, and lamented that [[Heathress Erenbund]] deserved better for all her hard work. The company eventually merged with [[Valiant Morgen Trading Company]] under [[Teklanis Anselm]], at which point its business grew rapidly. After this, Rhogar secured a gift for Heathress.
After this, Rhogar begins mentioning the [[Knives of Mystra]], and presenting to them the findings of himself and [[Etorn Hadaran]], who had been exploring the undercity when they made a breakthrough (possibly refering to the [[Acropolis of Kereskaa]] or certain of its contents).
The journal is then placed in the [[Bag of Holding]].
[[Category:Items in the Bag of Holding]]
1156c193f9db91f7d69d033ca682ec159673550e
291
285
2024-04-01T14:26:18Z
Vicht
1
Added Category:Written items
wikitext
text/x-wiki
A journal kept by [[Irann Rhogar]] and stored in a hidden compartment at the back of one of his desk drawers in the [[Valiant Morgen Trading Company Kaarst Branch]]. It is a handsome leatherbound journal, old and dogeared although its pages appear empty. Its writing can only be discerned by looking through the [[flat-bottomed ruby]] kept as a decoration on Rhogar's desk.
Using the flat-bottomed ruby, [[Mira]] skimmed the journal, reading certain parts out to [[Kham]], [[Vichthart]] and [[Orianna]].
Rhogar's personal journal goes back several years to when Rhogar's company was called Irann Promise Trading, when business was slow and he had few clientelle, and the company was merely surviving. Rhogar wanted to grow the business bigger, and lamented that [[Heathress Erenbund]] deserved better for all her hard work. The company eventually merged with [[Valiant Morgen Trading Company]] under [[Teklanis Anselm]], at which point its business grew rapidly. After this, Rhogar secured a gift for Heathress.
After this, Rhogar begins mentioning the [[Knives of Mystra]], and presenting to them the findings of himself and [[Etorn Hadaran]], who had been exploring the undercity when they made a breakthrough (possibly refering to the [[Acropolis of Kereskaa]] or certain of its contents).
The journal is then placed in the [[Bag of Holding]].
[[Category:Items in the Bag of Holding]]
[[Category:Written items]]
99e161f0ea0a5a31f1983823a57bce9e9b38ed73
Etorn Hadaran's pocketwatch
0
169
287
2024-04-01T01:19:32Z
Vicht
1
Created page with "After the [[bone devil]] is killed, [[Mira]] goes to [[Etorn Hadaran]]'s skeleton-less corpse and retrieves his <b>pocketwatch</b>, 60 silver pieces, his [[Etorn Hadaran's spellbook|spellbook]] and the [[Seal|Seal of Abjuration]]. Mira presents the timepiece to [[Sable Warden Meriele Berevan]] as a gift. She appraises it as being well made and expensive, then points out that since the [[Raven Queen]] is always counting every second, it is a very appropriate gift. Cate..."
wikitext
text/x-wiki
After the [[bone devil]] is killed, [[Mira]] goes to [[Etorn Hadaran]]'s skeleton-less corpse and retrieves his <b>pocketwatch</b>, 60 silver pieces, his [[Etorn Hadaran's spellbook|spellbook]] and the [[Seal|Seal of Abjuration]].
Mira presents the timepiece to [[Sable Warden Meriele Berevan]] as a gift. She appraises it as being well made and expensive, then points out that since the [[Raven Queen]] is always counting every second, it is a very appropriate gift.
[[Category:Items looted then parted with]]
b26f4c0e07563265a293366ec137a6f3d413fa6e
Etorn Hadaran's spellbook
0
170
288
2024-04-01T01:23:30Z
Vicht
1
Created page with "After the [[bone devil]] is killed, [[Mira]] goes to [[Etorn Hadaran]]'s skeleton-less corpse and retrieves his [[Etorn Hadaran's pocketwatch|pocketwatch]], 60 silver pieces, his <b>spellbook</b> and the [[Seal|Seal of Abjuration]]. The spellbook is dark leather, at first appearing black but actually dyed a very deep purple. It is decorated with a complex pattern of concentric and overlapping circles. In the 3 days after the bone devil is killed, Mira investigates the..."
wikitext
text/x-wiki
After the [[bone devil]] is killed, [[Mira]] goes to [[Etorn Hadaran]]'s skeleton-less corpse and retrieves his [[Etorn Hadaran's pocketwatch|pocketwatch]], 60 silver pieces, his <b>spellbook</b> and the [[Seal|Seal of Abjuration]].
The spellbook is dark leather, at first appearing black but actually dyed a very deep purple. It is decorated with a complex pattern of concentric and overlapping circles.
In the 3 days after the bone devil is killed, Mira investigates the nature of the book. It is apparent to him that it is a [[wizard]]'s spellbook, and he looks through to find spells that he can copy to his own [[Book of Shadows]] per his [[Book of Ancient Secrets]] eldritch invocation.
However, he also learns that this spellbook is enchanted in its own right. As an <b>Arcane Grimoire +1</b>, a wizard could use it as a spellcasting focus, gain a +1 bonus to spell attack rolls, gain a +1 bonus to saving throw DCs of their wizard spells, and regain an additional spellslot when using Arcane Recovery.
Not being a wizard, Mira has little use for these features, but the book has a further [[divination]] aura to it, which suggests there's some means to using it as a way to commune with something or someone.
When the party reviews the [[journal of Irann Rhogar]] with [[Galesong Thervan Indále]] and the Sable Warden, they note that [[Irann Rhoger]] was the one who gifted the spellbook to Etorn Hadaran.
[[Category:Items held by Mira]]
082a87bc61f41048ed1f1c3eb2e8204dadd77f92
292
288
2024-04-01T14:26:30Z
Vicht
1
Added Category:Written items
wikitext
text/x-wiki
After the [[bone devil]] is killed, [[Mira]] goes to [[Etorn Hadaran]]'s skeleton-less corpse and retrieves his [[Etorn Hadaran's pocketwatch|pocketwatch]], 60 silver pieces, his <b>spellbook</b> and the [[Seal|Seal of Abjuration]].
The spellbook is dark leather, at first appearing black but actually dyed a very deep purple. It is decorated with a complex pattern of concentric and overlapping circles.
In the 3 days after the bone devil is killed, Mira investigates the nature of the book. It is apparent to him that it is a [[wizard]]'s spellbook, and he looks through to find spells that he can copy to his own [[Book of Shadows]] per his [[Book of Ancient Secrets]] eldritch invocation.
However, he also learns that this spellbook is enchanted in its own right. As an <b>Arcane Grimoire +1</b>, a wizard could use it as a spellcasting focus, gain a +1 bonus to spell attack rolls, gain a +1 bonus to saving throw DCs of their wizard spells, and regain an additional spellslot when using Arcane Recovery.
Not being a wizard, Mira has little use for these features, but the book has a further [[divination]] aura to it, which suggests there's some means to using it as a way to commune with something or someone.
When the party reviews the [[journal of Irann Rhogar]] with [[Galesong Thervan Indále]] and the Sable Warden, they note that [[Irann Rhoger]] was the one who gifted the spellbook to Etorn Hadaran.
[[Category:Items held by Mira]]
[[Category:Written items]]
1cc3a4fcc1a69216a17c09e1abc56065a389f8c7
Erinyes feather
0
171
289
2024-04-01T12:53:23Z
Vicht
1
Created page with "When [[Mira]] and [[Grokko]] agree to free the <b>[[Erinyes]]</b> [[Vastren]] from the [[Spire of Conjuration]], Mira makes sure to include in the contract the receipt of a token of appreciation. Once they complete the ritual and Vastren steps free from her prison of the last few thousand years, she steps directly up to Mira, plucks one of the deep red <b>feathers</b> from her wing, and hands it to Mira, who accepts it and bows. The feather is uncomfortably hot to the t..."
wikitext
text/x-wiki
When [[Mira]] and [[Grokko]] agree to free the <b>[[Erinyes]]</b> [[Vastren]] from the [[Spire of Conjuration]], Mira makes sure to include in the contract the receipt of a token of appreciation. Once they complete the ritual and Vastren steps free from her prison of the last few thousand years, she steps directly up to Mira, plucks one of the deep red <b>feathers</b> from her wing, and hands it to Mira, who accepts it and bows.
The feather is uncomfortably hot to the touch without being harmful, like a freshly made cup of coffee. Mira heeds Grokko's warning to hide the feather from [[Anrel]] and [[Vichthart]] as they likely won't approve of freeing a [[devil]].
Investigating the feather in the 3 days that follow, Mira learns that the feather is not inherantly magical but could have some properties for the purposes of spellcasting. He can't establish a monetary value for it, but in that it is a token that not many people on the [[material plane]] can claim ownership of, it is valuably rare.
[[Category:Items held by Mira]]
19b2305339bd1157263cb3b01e9516d37ebecf06
Book of the Twinned Flame
0
172
290
2024-04-01T14:25:47Z
Vicht
1
Created page with "When the party enters the [[Acropolis_of_Kereskaa#Grand_Library|Grand Library]] of the Acropolis of Kereskaa, [[Vichthart]] collects several [[leatherbound books]] from a charred, rusted and grimy chest—the only surviving contents of the Library. Among them, [[Mira]] spots one <b>book with a red twinned flame</b> emblem on its cover, and asks for it from Vicht, who hands it over. After retrieving the [[Obsidian Claw]] from the Acropolis vault, the party takes a short..."
wikitext
text/x-wiki
When the party enters the [[Acropolis_of_Kereskaa#Grand_Library|Grand Library]] of the Acropolis of Kereskaa, [[Vichthart]] collects several [[leatherbound books]] from a charred, rusted and grimy chest—the only surviving contents of the Library. Among them, [[Mira]] spots one <b>book with a red twinned flame</b> emblem on its cover, and asks for it from Vicht, who hands it over.
After retrieving the [[Obsidian Claw]] from the Acropolis vault, the party takes a short rest to prepare for what they'll find inside the [[Spire of Abjuration]]. During this time, Mira begins to read through the book he's found. Though it is in a language he doesn't recognize, he can read it thanks to his [[Eyes of the Runekeeper]] eldritch invocation. It seems to be a journal by a mage recounting the rumours of a conquering champion who wielded divine fire, smiting the monsters that inhabit the deserts of [[Calaha]].
In the 3 days that follow their defeat of the [[bone devil]], Mira spends more time reading the book. The author is a mage but isn't identified in any way. They write about the rumours of a conquering champion called The [[Burning Lord]], who brandishes divine fire to defeat monsters across the Calaha desert. He is a local hero, with more and more people flocking to his cause, but there is no consensus on the nature of the hero's divine fire. Some rumours claim he is a mage using arcane magic, others claim he is a holy man, while still others talk about the fire being allegorical. The author is particularly interested in determining which of these is truest, and plans to journey to Calaha to meet the Burning Lord. However, the final pages do not conclude about whether this actually occurred.
Eventually someone is able to identify the language of the book for Mira. It is an old language with no particular name, used in Calaha before it died out and was replaced by modern languages that evolved from it.
[[Category:Items held by Mira]]
[[Category:Written items]]
147bc9e65f427e91ed54ac8316317ca72ab900a5
297
290
2024-04-01T14:39:25Z
Vicht
1
Added that Mira recognized the script
wikitext
text/x-wiki
When the party enters the [[Acropolis_of_Kereskaa#Grand_Library|Grand Library]] of the Acropolis of Kereskaa, [[Vichthart]] collects several [[leatherbound books]] from a charred, rusted and grimy chest—the only surviving contents of the Library. Among them, [[Mira]] spots one <b>book with a red [[twinned flame]]</b> emblem on its cover, and asks for it from Vicht, who hands it over.
After retrieving the [[Obsidian Claw]] from the Acropolis vault, the party takes a short rest to prepare for what they'll find inside the [[Spire of Abjuration]]. During this time, Mira begins to read through the book he's found. He recognizes the script but not the language, though he can read it thanks to his [[Eyes of the Runekeeper]] eldritch invocation. It seems to be a journal by a mage recounting the rumours of a conquering champion who wielded divine fire, smiting the monsters that inhabit the deserts of [[Calaha]].
In the 3 days that follow their defeat of the [[bone devil]], Mira spends more time reading the book. The author is a mage but isn't identified in any way. They write about the rumours of a conquering champion called The [[Burning Lord]], who brandishes divine fire to defeat monsters across the Calaha desert. He is a local hero, with more and more people flocking to his cause, but there is no consensus on the nature of the hero's divine fire. Some rumours claim he is a mage using arcane magic, others claim he is a holy man, while still others talk about the fire being allegorical. The author is particularly interested in determining which of these is truest, and plans to journey to Calaha to meet the Burning Lord. However, the final pages do not conclude about whether this actually occurred.
Eventually someone is able to identify the language of the book for Mira. It is an old language with no particular name, used in Calaha before it died out and was replaced by modern languages that evolved from it.
[[Category:Items held by Mira]]
[[Category:Written items]]
dcd5c73d55cfbacf9893b726ed61f820d2355d5c
Leatherbound books
0
173
293
2024-04-01T14:33:27Z
Vicht
1
Created page with "When the party enters the [[Acropolis_of_Kereskaa#Grand_Library|Grand Library]] of the Acropolis of Kereskaa, [[Vichthart]] collects several <b>leatherbound books</b> from a charred, rusted and grimy chest—the only surviving contents of the Library. Among them, [[Mira]] spots one <b>book</b> with a red <b>twinned flame</b> emblem on its cover, and asks for it from Vicht, who hands it over. [[Suithrathus Luirmo]] says that the books in the Grand Library aren't inherant..."
wikitext
text/x-wiki
When the party enters the [[Acropolis_of_Kereskaa#Grand_Library|Grand Library]] of the Acropolis of Kereskaa, [[Vichthart]] collects several <b>leatherbound books</b> from a charred, rusted and grimy chest—the only surviving contents of the Library. Among them, [[Mira]] spots one <b>book</b> with a red <b>twinned flame</b> emblem on its cover, and asks for it from Vicht, who hands it over.
[[Suithrathus Luirmo]] says that the books in the Grand Library aren't inherantly magical, but are tomes of magical knowledge.
[[Category:Items in the Bag of Holding]]
[[Category:Written items]]
06b06dbce24054f308c4a76d03d3330019e75821
Irann Rhogar's journal
0
174
294
2024-04-01T14:33:55Z
Vicht
1
Redirected page to [[Journal of Irann Rhogar]]
wikitext
text/x-wiki
#REDIRECT [[Journal of Irann Rhogar]]
6d4e4d3e279ecb0bfd6c194df46f125b3273ca76
Pocketwatch of Etorn Hadaran
0
175
295
2024-04-01T14:36:43Z
Vicht
1
Redirected page to [[Etorn Hadaran's pocketwatch]]
wikitext
text/x-wiki
#REDIRECT [[Etorn Hadaran's pocketwatch]]
234a784b89e125f640a769a4c48e40343dd80314
Spellbook of Etorn Hadaran
0
176
296
2024-04-01T14:37:18Z
Vicht
1
Redirected page to [[Etorn Hadaran's spellbook]]
wikitext
text/x-wiki
#REDIRECT [[Etorn Hadaran's spellbook]]
2373290b85f31aa688d76f0fa27afc3efb68ee77
Diamond
0
177
298
2024-04-01T15:01:51Z
Vicht
1
Created page with "A <b>diamond</b> is a rare and valuable gemstone. [[Ser Reginald Kobolwitz]] wrote that he had wrestled a [[dragon]] and taken its diamond, although [[Vichthart]] found his writing pompous not to mention unverifiable. Vichthart later perused the [[Ravensfair]] market stalls for 200 gold pieces' worth of diamond dust so he could cast the spell [[Glyph of Warding]], but this was of course far too rare and valuable for market stalls to stock. When [[Mira]] recovers the val..."
wikitext
text/x-wiki
A <b>diamond</b> is a rare and valuable gemstone. [[Ser Reginald Kobolwitz]] wrote that he had wrestled a [[dragon]] and taken its diamond, although [[Vichthart]] found his writing pompous not to mention unverifiable. Vichthart later perused the [[Ravensfair]] market stalls for 200 gold pieces' worth of diamond dust so he could cast the spell [[Glyph of Warding]], but this was of course far too rare and valuable for market stalls to stock.
When [[Mira]] recovers the valuables he lost to the mirror device in the [[Spire of Transmutation]]—106 gold pieces, 12 silver pieces, 6 copper pieces, 1 [[pearl]] worth 100 gold pieces, and 1 [[candlestick]] worth about 25 gold pieces—in the vault of the [[Acropolis of Kereskaa]], he also finds and takes 3 diamonds. In the 3 days after the [[bone devil]] is defeated, Mira gets these appraised as having a combined value of 500 gold pieces.
The emblem of the [[Valiant Morgen Trading Company]] is a diamond in front of a red rising sun. It is portrayed in the stained glass window about the main entrance to the [[Valiant Morgen Trading Company Kaarst Branch]].
[[Category:Items held by Mira]]
[[Category:Mineral items]]
5d2ace387c7c97b96208b3ea21b3d5d0a19c8187
299
298
2024-04-01T15:13:01Z
Vicht
1
Added Grokko's diamond
wikitext
text/x-wiki
A <b>diamond</b> is a rare and valuable gemstone. [[Grokko]] found a diamond worth 50 gold pieces along with a [[topaz]] and a [[sapphire]].
[[Ser Reginald Kobolwitz]] wrote that he had wrestled a [[dragon]] and taken its diamond, although [[Vichthart]] found his writing pompous not to mention unverifiable. Vichthart later perused the [[Ravensfair]] market stalls for 200 gold pieces' worth of diamond dust so he could cast the spell [[Glyph of Warding]], but this was of course far too rare and valuable for market stalls to stock.
When [[Mira]] recovers the valuables he lost to the mirror device in the [[Spire of Transmutation]]—106 gold pieces, 12 silver pieces, 6 copper pieces, 1 [[pearl]] worth 100 gold pieces, and 1 [[candlestick]] worth about 25 gold pieces—in the vault of the [[Acropolis of Kereskaa]], he also finds and takes 3 diamonds. In the 3 days after the [[bone devil]] is defeated, Mira gets these appraised as having a combined value of 500 gold pieces.
The emblem of the [[Valiant Morgen Trading Company]] is a diamond in front of a red rising sun. It is portrayed in the stained glass window about the main entrance to the [[Valiant Morgen Trading Company Kaarst Branch]].
[[Category:Items held by Mira]]
[[Category:Mineral items]]
4e2d0f0479339464ffc48e7d4e0038c32dc5bb57
Ruby
0
178
300
2024-04-01T15:43:22Z
Vicht
1
Created page with "A <b>ruby</b> is a valuable gemstone. * [[Vichthart]] has a bag of ruby beads valued at 50 gold pieces. * [[Sable Warden Meriele Berevan]] wears a simple dark steel circlet with a blood-red ruby inset. * A [[flat-bottomed ruby]] was used by [[Irann Rhoger]] to read [[devil blood ink]]. * [[Etaf]] wears a ruby choker. * A peach-sized rough ruby was inside a bundle of cloth in the [[Nothing]]s' bedroom. * [[Suithrathus Luirmo]] transfers himself from his black quartz divi..."
wikitext
text/x-wiki
A <b>ruby</b> is a valuable gemstone.
* [[Vichthart]] has a bag of ruby beads valued at 50 gold pieces.
* [[Sable Warden Meriele Berevan]] wears a simple dark steel circlet with a blood-red ruby inset.
* A [[flat-bottomed ruby]] was used by [[Irann Rhoger]] to read [[devil blood ink]].
* [[Etaf]] wears a ruby choker.
* A peach-sized rough ruby was inside a bundle of cloth in the [[Nothing]]s' bedroom.
* [[Suithrathus Luirmo]] transfers himself from his black quartz diving mirror to an uncut ruby.
* The [[fey apple]] that the [[feywild tree]] gives to [[Grokko]] is ruby-red.
[[Category:Items held by Vichthart]]
[[Category:Mineral items]]
80c25fc4a118d81b7b38d64e1eded8d65793f806
Slabbledab
0
11
301
13
2024-04-01T16:08:59Z
Vicht
1
wikitext
text/x-wiki
[[Goblin]] member of [[The Piß Keepers]]. Played by [[Neal]].
[[Category:Members of The Piß Keepers]]
[[Category:Characters played by Kevin]]
0b0695c93525cb1c77effa864c0ce3572cbd547a
Kenneth
0
28
302
31
2024-04-01T16:09:06Z
Vicht
1
wikitext
text/x-wiki
<dfn><b>Kenneth Smit</b></dfn> is an [[Artificer]] specializing in Artillerism who joins [[Grokko]] and [[Vichthart]] when their ship, <i class="ship">The Crested Eagle</i>, sank in a mysterious storm off the coast near [[Meeresdorf]]. Known for his use of the [[Magic Stone]] cantrip, for which Grokko calls him <b>Stone Boy</b>. Builds a pair of [[Goggles of Night|goggles that bestow night vision]] that he shares with Vichthart until his departure, and begins making [[eldritch cannon]]s that can function as a flamethrower. Kenneth goes triggerhappy when he first uses his flamethrower, cutting down smugglers as they try to flee.
Kenneth used to fight alongside [[Kerstin Pletscher]] near the [[Sternwall]], [[Bükerstadt]], but hails originally from somewhere not far south of [[Hellenhelm]]. His friend [[Nikola]] has not been found since Bükerstadt was occupied by [[orc]]s. According to a rumour heard by Vichthart on <i class="ship">The Crested Eagle</i>, Kenneth once made a small fortune in the south running a trade caravan.
Kenneth began staying behind to protect others starting in [[Droghen’s keep]], when he stays in the dungeon to protect its human prisoners. He then stays in Meeresdorf while Grokko, [[Kham]] and Vicht find <i class="Dancing in the Storm">Dancing in the Storm</i> to keep the village protected in case [[Droghen]] decides to attack it. After that, he again stays with the [[Zaheer island|island's]] slaves instead of going to confront [[Srir]]. He elects to leave the party permanently once Srir is defeated, taking his Goggles of the Night with him.
[[Category:Characters played by Neal]]
[[Category:Artificers]]
[[Category:Members of the Iron Tempest Mercenary Company]]
178b35e596b76a89e1b6581f801439441105cb52
Template:Characters
10
147
303
264
2024-04-01T16:26:01Z
Vicht
1
Added Fenwar Twins, Mistress Illefina, Anastel, Conflagracy, Burning Lord, Maghn Ünthergol and Aran; moved Kham Gohlrim and Ingen to Verein Kirche; renamed Kham to Anrel, Ingen to Ingen Persson, and King Lorenz Arkhelle XVI to King Lorenz Friedriche Arkhelle XVI
wikitext
text/x-wiki
{{Navbox
| state = plain
| listclass = hlist
| title = Characters
| group1 = Heroes
| list1 =
{{Navbox|child
| group2 = An Arkhellen Adventure
| list2 =
* [[Grokko]]
* [[Kenneth]]
* [[Anrel]]
** [[Grimm]]
* [[Mira]]
** [[Etaf]]
* [[Vichthart]]
| group3 = [[The Piß Keepers]]
| list3 =
* [[Elias]]
* [[Grezz]]
* [[Cora Hothead]]
* [[Slabbledab]]
| group4 = Dragon Barrow
| list4 =
* [[Mai Dèanta]]
* [[Iagan Liath]]
* [[Ealar Sgàrlaid]]
* [[Tasgall Uaine]]
| group5 = Talyen Tales
| list5 =
* [[Elmar Grunmeier]]
* [[Tayana Ralovyre]]
* [[Verdec Sharakas]]
* [[Kuno Wirz]]
}} <!-- End Heroes -->
| group6 = [[Meeresdorf]]
| list6 =
* [[Barthon]]
* [[Bracka]]
* [[Solomon Dugraf]]
* [[Lania Falst]]
* [[Captain Gaardan Haupmann]]
* [[Marta Tierstärk]]
* [[Merric Tierstärk]]
| group7 = [[Senneborn]]
| list7 =
* [[St Anorad]]
* [[Judita Bandelmann]]
* [[Captain Eggehart]]
* [[Ogdavis]]
* [[Kerstin Pletscher]]
* [[Brumnir Torfelt]]
| group8 = Droghen
| list8 =
* [[Arnt]]
* [[Bertrand]]
* [[Bezur]]
* [[Bill]]
* [[Davin]]
* [[Armine Detlef]]
* [[Droghen]]
* [[Falk]]
* [[Hilta]]
* [[Jochim]]
* [[Knuth]]
* [[Ogak]]
* [[Spotter]]
* [[Swiper]]
* [[Talxa]]
* [[Tark]]
* [[Vantan]]
| group9 = [[Zaheer island|Island]]
| list9 =
* [[Beatrux]]
* [[Celia]]
* [[Heineer Doonan]]
* [[Kylian]]
* [[Preston]]
* [[Srir Silthallow]]
* [[Szehga Silthallow]]
* [[Rrekkeh Stormcrawler]]
* [[Watcher]]
* [[Prince Yunogu]]
| group10 = [[Roughspun Coast]]
| list10 =
* [[Jenora Greenheart]]
* [[Handy]]
* [[Irebi]]
* [[Mist]]
* [[Tatha]]
* [[Yks]]
| group11 = [[Verein Kirche von Arkhelle]]
| list11 =
* [[Sable Warden Meriele Berevan]]
* [[Black]]
* [[Father Traulam Eugen]]
* [[Fenwar Twins]]
* [[Decheimül Fezzilbahn]]
* [[Father Eivald Glissan]]
* [[Kham Gohlrim]]
* [[Holy Quorum]]
* [[Galesong Thervan Indále]]
* [[Pas]]
* [[Ingen Persson]]
* [[Cardinal Maurul Silkendawn]]
* [[Maghn Ünthergol]]
| group12 = [[Kaarst]]
| list12 =
{{Navbox|child
| group13 = [[Kaarst City Watch|City Watch]]
| list13 =
* [[Orryn Daergel]]
* [[Sergeant Therai Doudra]]
* [[Eren]]
* [[Hilde]]
* [[Lieutenant General Inafel]]
* [[Tamaran]]
* [[Captain Felosiel Teinithra]]
* [[Vanas]]
| group14 = [[Squall's Beacon]]
| list14 =
* [[Eldon Garrick]]
* [[Amnon Ingolidan]]
* [[Samus]]
* [[Eurgaran Wihta]]
* [[Heda Wihta]]
| group15 = [[Knives of Mystra]]
| list15 =
* [[Aran]]
* [[Etorn Hadaran]]
* [[Reiner Hoss]]
* [[Leagallow Tiaathque]]
* [[Uthan]]
* [[Yaan]]
| group16 = [[The Tide]]
| list16 =
* [[Arnuanna]]
* [[Esker]]
* [[Luther]]
* [[Orianna]]
* [[Rewyn]]
| group17 = [[Valiant Morgen Trading Company|Valiant Morgen]]
| list17 =
* [[Antoniya Brosch]]
* [[Heathress Erenbund]]
* [[Malte Faerber]]
* [[Captain Adran Mokam]]
* [[Caphri Pilc]]
* [[Irann Rhogar]]
* [[Anselm Teklanis]]
* [[Tilos]]
* [[Thava Windreaver]]
| group18 = [[Acropolis of Kereskaa]]
| list18 =
* [[Elgrex Anderra]]
* [[Cansa Cinsmic]]
* [[Befrir Dalovamri]]
* [[Henry Hungleberry]]
* [[Suithrathus Luirmo]]
* [[Teklanna Morantine]]
* [[Farlu Naenreh]]
* [[Toross Rhistel]]
* [[Vithra Rutgeth]]
* [[Vastren]]
| group19 = Other
| list19 =
* [[Achima]]
* [[Bogdan]]
* [[Bogdin]]
* [[Delilah]]
* [[Governor Escherin]]
* [[Ruda Frank]]
* [[Ginger]]
* [[Claira Hanali]]
* [[Ertus Heda]]
* [[Thodris Holderheck]]
* [[Ser Reginald Kobolwitz]]
* [[Xandahire Kobolwitz]]
* [[C. B. L.]]
* [[Elira Lein]]
* [[Lilly]]
* [[Administrator Lorsalyn Pri]]
* [[Tyrant]]
}} <!-- End Kaarst subsets -->
| group20 = [[Fuarcrùn Freeholds]]
| list20 =
* [[Draca]]
* [[Ingen]]
* [[Kaelinu]]
| group21 = [[Havenhaft]]
| list21 =
* [[Charles]]
* [[Eoin]]
* [[James]]
* [[Alafonz Kalazorn]]
* [[Shusk]]
| group22 = [[Bergstraßer]]
| list22 =
* [[Iron Fang]]
* [[Seebo]]
* [[Doug Zenner]]
| group23 = [[Arkhellen Empire]]
| list23 =
* [[Anastel]]
* [[King Lorenz Friedriche Arkhelle XVI]]
* [[Mistress Illefina]]
* [[Iron Tempest Mercenary Company]]
* [[Nikola]]
* [[Rosamund]]
| group24 = [[Calaha]]
| list24 =
* [[Burning Lord]]
* [[Conflagracy]]
| group25 = Gods
| list25 =
{{Navbox|child
| group26 = [[Verein Kirche von Arkhelle]]
| list26 =
* [[Avandra]]
* [[Bahamut]]
* [[Erathis]]
* [[Ioun]]
* [[Kord]]
* [[Moradin]]
* [[Mystra]]
* [[Pelor]]
* [[Raven Queen]]
* [[Sarenrae]]
* [[Selune]]
* [[Zaheer]]
| group27 = Other
| list27 =
* [[Bane]]
* [[Corellon]]
* [[Gruumsch]]
* [[Teli Monei]]
}} <!-- End of Gods -->
| group28 = Pseudonyms
| list28 =
* [[Etorn Hadaran|Ashmaker]]
* [[Suithrathus Luirmo|Mr Curtain]]
* [[Esker|E]]
* [[Kham|Frank]]
* [[Szehga Silthallow|Gurta]]
* [[Szehga Silthallow|Haga]]
* [[Arnuanna|J]]
* [[Vichthart|Señor José]]
* [[Grokko|Julian]]
* [[Mystra|Kereskaa]]
* [[Grimm|Moose Knuckle]]
* [[Kham|My Emotions Will Never Hurt Me]]
* [[Vichthart|Priest Man]]
* [[Kenneth|Stoneboy]]
* [[Grokko|Strangehands]]
* [[Orianna|V]]
| group29 = Unknown
| list29 =
* [[Billy-Bob Gene-Joel]]
* [[Erdak]]
* [[Evailen]]
* [[Gurnin]]
* [[Jathnel]]
* [[Kinrel]]
* [[Florine Oakstein]]
}}
07aac5d151030bf5167e06b1fc26fb9e214a3f56
Template:Locations
10
148
304
254
2024-04-01T16:30:26Z
Vicht
1
Added Aern, Basilica Endeavorant and Ùrlar Valley
wikitext
text/x-wiki
{{Navbox
| state = plain
| listclass = hlist
| title = Locations
| group1 = Planes
| list1 =
* [[Nine Hells]]
** [[Nesus]]
* [[Feywild]]
| group2 = Bodies
| list2 =
* [[Asíl]]
* [[Ashtkhaan]]
{{Navbox|child
| group3 = [[Talyen]]
| list3 =
* [[Calaha]]
* [[Dhintay]]
* [[Eaos]]
* [[Savra]]
* [[Spanish]]
{{Navbox|child
| group4 = [[Elengon]]
| list4 =
* [[Fuarcrùn Freeholds]]
** [[Scierce]]
** [[Ùrlar Valley]]
* [[Ifkhamurud]]
* [[Kythera]]
* [[Leurisan]]
* [[Medinian Republic]]
* [[Rossaña]]
* [[Süddorn]]
* [[Sundering Sea]]
* [[Wüstenwast]]
{{Navbox|child
| group5 = [[Arkhellen Empire]]
| list5 =
* [[Arkhelle]]
** [[Baumeln]]
** [[Heldruh]]
** [[Hellenhelm]]
*** [[Basilica Endeavorant]]
*** [[Wesselbern Palast]]
* [[Brenhalt]]
** [[Kalazorn Ranch]]
** [[Bükerstadt]]
** [[Stolzfestung]]
* [[Denkrei]]
** [[Bergstraßer]]
*** [[The Vicious Crab]]
*** [[Mountain Iron]]
** [[Schmiedentruum]]
* [[Teremberg]]
* [[Vargesse]]
* [[Verrameln]]
* [[Würtzollen]]
** [[Ostweg-Treffen]]
{{Navbox|child
| group6 = [[Scharn]]
| list6 =
* [[Aern]]
* [[Heidestedt]]
* [[Roughspun Coast]]
* [[Salz Bay]]
* [[Scharnwald]]
{{Navbox|child
| group7 = [[Western Scharn]]
| list7 =
* [[Aleph Marsh]]
* [[Cralw]]
* [[Bacheim]]
* [[Darkwasser Wald]]
* [[Droghen's keep]]
* [[Gnoll encampment]]
* [[Zaheer island]]
* [[Kusen]]
* [[Löwenalt]]
* [[Salzreich]]
* [[Strandholm]]
* [[Wurzel Drain]]
* [[Wüsthafen]]
{{Navbox|child
| group8 = [[Meeresdorf]]
| list8 =
* [[Bear's End Inn]]
* [[Blue Birch Costermonger]]
* [[The Dauntless Shield]]
| group9 = [[Senneborn]]
| list9 =
* [[Broken Thorn]]
* [[Church of St Anorad]]
* [[The Katz und Imp]]
* [[Ogdavis' Apotheker]]
* [[Ratway]]
* [[Schnellhoof Carriagemaster's]]
}} <!-- End of Western Scharn -->
| group10 = [[Kaarst]]
| list10 =
* [[Anshaung Bridge]]
* [[City Watch Headquarters]]
* [[Kaarst City Waterworks Guild]]
* [[Kade Sirrine Kathedrale]]
* [[Karmesin Palast]]
* [[Kobolwitz Manor]]
* [[Lighning Tree]]
* [[Mastaff River]]
* [[Ravensfair]]
* [[Sombre Lyceum]]
* [[Squall's Beacon]]
* [[Valiant Morgen Trading Company Kaarst Branch]]
* [[Valiant Morgen Trading Company warehouse]]
{{Navbox|child
| group11 = Shops
| list11 =
* [[Baron's Cask]]
* [[Cask of the Lonely Drunkard]]
* [[The Copper Roost]]
* [[Delilah's Delicatessan]]
* [[Drunkard's Cask]]
* [[Jonathan's Tavern]]
* [[Kaarst Kebab Shop]]
* [[Lily's Pastries and Baked Goods]]
* [[Lion's Apothecary]]
* [[The Night Stone]]
* [[The Sunken Giant]]
* [[Tiaathque's Medicinal Remedies]]
| group12 = Wards
| list12 =
* [[Bell Ward]]
* [[Flock Ward]]
* [[Lamp Ward]]
* [[Mastaff Ward]]
* [[Rook Ward]]
* [[Outer City]]
| group13 = [[Acropolis of Kereskaa]]
| list13 =
* [[Spire of Conjuration]]
* [[Spire of Divination]]
* [[Spire of Necromancy]]
* [[Spire of Abjuration]]
* [[Spire of Evocation]]
* [[Spire of Illusion]]
* [[Spire of Enchantment]]
* [[Spire of Transmutation]]
}} <!-- End of Kaarst -->
}} <!-- End Scharn -->
}} <!-- End of Arkhellen Empire -->
}} <!-- End of Elengon -->
}} <!-- End of Talyen -->
}} <!-- End of Bodies -->
}} <!-- End -->
878b970e72b1c677fb86cc8b0c72559decdcd691
314
304
2024-04-02T00:41:16Z
Vicht
1
Corrected spelling of Nessus, nested Dhintay under Calaha
wikitext
text/x-wiki
{{Navbox
| state = plain
| listclass = hlist
| title = Locations
| group1 = Planes
| list1 =
* [[Nine Hells]]
** [[Nessus]]
* [[Feywild]]
| group2 = Bodies
| list2 =
* [[Asíl]]
* [[Ashtkhaan]]
{{Navbox|child
| group3 = [[Talyen]]
| list3 =
* [[Calaha]]
** [[Dhintay]]
* [[Eaos]]
* [[Savra]]
* [[Spanish]]
{{Navbox|child
| group4 = [[Elengon]]
| list4 =
* [[Fuarcrùn Freeholds]]
** [[Scierce]]
** [[Ùrlar Valley]]
* [[Ifkhamurud]]
* [[Kythera]]
* [[Leurisan]]
* [[Medinian Republic]]
* [[Rossaña]]
* [[Süddorn]]
* [[Sundering Sea]]
* [[Wüstenwast]]
{{Navbox|child
| group5 = [[Arkhellen Empire]]
| list5 =
* [[Arkhelle]]
** [[Baumeln]]
** [[Heldruh]]
** [[Hellenhelm]]
*** [[Basilica Endeavorant]]
*** [[Wesselbern Palast]]
* [[Brenhalt]]
** [[Kalazorn Ranch]]
** [[Bükerstadt]]
** [[Stolzfestung]]
* [[Denkrei]]
** [[Bergstraßer]]
*** [[The Vicious Crab]]
*** [[Mountain Iron]]
** [[Schmiedentruum]]
* [[Teremberg]]
* [[Vargesse]]
* [[Verrameln]]
* [[Würtzollen]]
** [[Ostweg-Treffen]]
{{Navbox|child
| group6 = [[Scharn]]
| list6 =
* [[Aern]]
* [[Heidestedt]]
* [[Roughspun Coast]]
* [[Salz Bay]]
* [[Scharnwald]]
{{Navbox|child
| group7 = [[Western Scharn]]
| list7 =
* [[Aleph Marsh]]
* [[Cralw]]
* [[Bacheim]]
* [[Darkwasser Wald]]
* [[Droghen's keep]]
* [[Gnoll encampment]]
* [[Zaheer island]]
* [[Kusen]]
* [[Löwenalt]]
* [[Salzreich]]
* [[Strandholm]]
* [[Wurzel Drain]]
* [[Wüsthafen]]
{{Navbox|child
| group8 = [[Meeresdorf]]
| list8 =
* [[Bear's End Inn]]
* [[Blue Birch Costermonger]]
* [[The Dauntless Shield]]
| group9 = [[Senneborn]]
| list9 =
* [[Broken Thorn]]
* [[Church of St Anorad]]
* [[The Katz und Imp]]
* [[Ogdavis' Apotheker]]
* [[Ratway]]
* [[Schnellhoof Carriagemaster's]]
}} <!-- End of Western Scharn -->
| group10 = [[Kaarst]]
| list10 =
* [[Anshaung Bridge]]
* [[City Watch Headquarters]]
* [[Kaarst City Waterworks Guild]]
* [[Kade Sirrine Kathedrale]]
* [[Karmesin Palast]]
* [[Kobolwitz Manor]]
* [[Lighning Tree]]
* [[Mastaff River]]
* [[Ravensfair]]
* [[Sombre Lyceum]]
* [[Squall's Beacon]]
* [[Valiant Morgen Trading Company Kaarst Branch]]
* [[Valiant Morgen Trading Company warehouse]]
{{Navbox|child
| group11 = Shops
| list11 =
* [[Baron's Cask]]
* [[Cask of the Lonely Drunkard]]
* [[The Copper Roost]]
* [[Delilah's Delicatessan]]
* [[Drunkard's Cask]]
* [[Jonathan's Tavern]]
* [[Kaarst Kebab Shop]]
* [[Lily's Pastries and Baked Goods]]
* [[Lion's Apothecary]]
* [[The Night Stone]]
* [[The Sunken Giant]]
* [[Tiaathque's Medicinal Remedies]]
| group12 = Wards
| list12 =
* [[Bell Ward]]
* [[Flock Ward]]
* [[Lamp Ward]]
* [[Mastaff Ward]]
* [[Rook Ward]]
* [[Outer City]]
| group13 = [[Acropolis of Kereskaa]]
| list13 =
* [[Spire of Conjuration]]
* [[Spire of Divination]]
* [[Spire of Necromancy]]
* [[Spire of Abjuration]]
* [[Spire of Evocation]]
* [[Spire of Illusion]]
* [[Spire of Enchantment]]
* [[Spire of Transmutation]]
}} <!-- End of Kaarst -->
}} <!-- End Scharn -->
}} <!-- End of Arkhellen Empire -->
}} <!-- End of Elengon -->
}} <!-- End of Talyen -->
}} <!-- End of Bodies -->
}} <!-- End -->
a236582e27305a0a5b32711b7dd0cf8978ffa3d6
Rossaña
0
179
305
2024-04-01T21:54:33Z
Vicht
1
Created page with "A country in the southeast of [[Elengon]], far away from the [[Arkhellen Empire]] on the far side of the [[Sundering Sea]]. It has recently been through a civil war, which has resulted in a portion of the territory splitting into its own independent nation, [[Leurisan]]. It was the apparent origin of [at least one of] the suits of armour in [[Kobolwitz Manor]] as they bore the country's typical plumage and golden embellishments. [[Category:Countries]]"
wikitext
text/x-wiki
A country in the southeast of [[Elengon]], far away from the [[Arkhellen Empire]] on the far side of the [[Sundering Sea]]. It has recently been through a civil war, which has resulted in a portion of the territory splitting into its own independent nation, [[Leurisan]]. It was the apparent origin of [at least one of] the suits of armour in [[Kobolwitz Manor]] as they bore the country's typical plumage and golden embellishments.
[[Category:Countries]]
ccd7a14f11a649d07bb1731cdf632379aca8e5c6
308
305
2024-04-01T22:19:10Z
Vicht
1
Reworded to say that Ser Kobolwitz apparently visited
wikitext
text/x-wiki
A country in the southeast of [[Elengon]], far away from the [[Arkhellen Empire]] on the far side of the [[Sundering Sea]]. It has recently been through a civil war, which has resulted in a portion of the territory splitting into its own independent nation, [[Leurisan]].
It has at some point been visited by [[Ser Reginald Kobolwitz]], who brought back a suit of armour in its style, with plumage and golden embellishments, to be placed in [[Kobolwitz Manor]].
[[Category:Countries]]
95ac544dd3b78389ea0d555f48d8e6f736f7f8bf
Leurisan
0
180
306
2024-04-01T22:02:20Z
Vicht
1
Created page with "A country in the southeast of [[Elengon]], far away from the [[Arkhellen Empire]] on the far side of the [[Sundering Sea]]. The country of [[Rossaña]] recently went through a civil war, which resulted in a portion of the territory splitting into its own independent nation, <b>Leurisan</b>. [[Orianna]] and [[Arnuanna]] were raised together in Leurisan before they moved to the Arkhellen Empire. When Orianna learns about Arnuanna's secret master, she paces the room mutter..."
wikitext
text/x-wiki
A country in the southeast of [[Elengon]], far away from the [[Arkhellen Empire]] on the far side of the [[Sundering Sea]]. The country of [[Rossaña]] recently went through a civil war, which resulted in a portion of the territory splitting into its own independent nation, <b>Leurisan</b>.
[[Orianna]] and [[Arnuanna]] were raised together in Leurisan before they moved to the Arkhellen Empire. When Orianna learns about Arnuanna's secret master, she paces the room muttering curses in Leurisan, which nobody else understood.
[[Category:Countries]]
b67ccb753a9a08e8102fbcbc230374e2abfd1cb8
Dhintay
0
181
307
2024-04-01T22:17:07Z
Vicht
1
Created page with "A country in the continent of [[Calaha]]. Its ruling party is called the [[Conflagracy]]. While they are waiting in the [[Valiant Morgen warehouse]], [[Grokko]] beats [[Mira]] at a dice game, so Mira tells Grokko that he is from <b>Dhintay</b>. During the 3 days after the [[bone devil]] is killed, Mira asks [[Orianna]] if she recognizes the twinned flame symbol on his [[Book of the Twinned Flame]], and she thinks she recalls seeing it on a seal on a letter, or other pi..."
wikitext
text/x-wiki
A country in the continent of [[Calaha]]. Its ruling party is called the [[Conflagracy]].
While they are waiting in the [[Valiant Morgen warehouse]], [[Grokko]] beats [[Mira]] at a dice game, so Mira tells Grokko that he is from <b>Dhintay</b>.
During the 3 days after the [[bone devil]] is killed, Mira asks [[Orianna]] if she recognizes the twinned flame symbol on his [[Book of the Twinned Flame]], and she thinks she recalls seeing it on a seal on a letter, or other piece of paper, belonging to her brother [[Arnunna]]. Mira asks if she's heard of Dhintay, and she recalls it as being a country in the east, but she's not familiar with the [[Conflagracy]] because she doesn't pay much attention to the politics of other places. Mira says the symbol belongs to the assassins of the Conflagracy, prompting Orianna to quip, ‘Ah, political shit.’
[[Category:Countries]]
5db012c7b5b2fcb45d68072a2ace8e049ff2ff22
Asíl
0
182
309
2024-04-01T22:37:23Z
Vicht
1
Created page with "[[Talyen]]'s only moon, a silvery orb. [[Ansel]] points it out on [[Suithrathus Luirmo]]'s orrery in the [[Spire of Divination]]. [[Category:Celestial bodies]]"
wikitext
text/x-wiki
[[Talyen]]'s only moon, a silvery orb. [[Ansel]] points it out on [[Suithrathus Luirmo]]'s orrery in the [[Spire of Divination]].
[[Category:Celestial bodies]]
8222a7bb1b0bf43ec1c27a7c17f7dc644e23f52d
Timeline
0
5
310
263
2024-04-01T22:58:45Z
Vicht
1
Added last appearance of Ashtkaan, disappearance of Kham Gohlrim, 18 and 19 Thelliea; updated events at Ùrlar Valley, 15th Thelliea and Emperor's full name
wikitext
text/x-wiki
== Ancient history ==
* Age of Great Ruin—soul of a Great Wyrm becomes held by [[Dragon Orb of Drimysthonontas]]
* Age of Enlightenment—[[Squall's Beacon]] constructed in [[Farankaars]]
* [[Kereskaa]] contains Dragon Orb of Drimysthonontas, [[Acropolis of Kereskaa]] built above it
* A servant of [[Corellon]] gifts a [[feywild tree|tree from the Feywild]] to the Acropolis of Kereskaa for ‘a good deed done’
* [[Master Suithrathus Luirmo]] begins his tenure at Acropolis of Kereskaa
* Veteran of the [[Blood Wars]], [[Vastren]] is summoned into the catacomb beneath the [[Spire of ]]
* 576th year of the Age of Enlightenment—[[Teklanna Morantine]] betrays the Acropolis of Kereskaa to the [[Kytheran]]s, who destroy the Acropolis
* [[Tyrant]] rules [[Kaarst]], their statue is collapsed into the bay leaving [[Tyrant's Folly]]
* Age of Decadence—arcane magic is used for unpleasant purposes in Kaarst
* [[Great War]] between gods of good and evil for hundreds of years; flying cities used as weapons
* Thousands of years ago, Great War is ended by [[Divine Accords]]; [[Bahamut]] and [[Teli Monei]] sign
* A little over 500 years ago, the most recent appearance of [[Ashtkaan]]
== Recent history==
; 3 generations ago
: Founding of Arkhellen Empire; 12 churches are united as [[Verein Kirche von Arkhelle]]
; >80 years ago
: Birth of [[Maurul Silkendawn]]
; 55–59 years ago
: Birth of [[Reginald Kobolwitz]]
; 47 years ago
: Birth of [[Traulam Eugen]]
; 35 years ago
: Birth of [[Lorenzo Arkhelle]]
; 12 years ago
: [[King Lorenzo Friedriche Arkhelle XVI]] becomes 3rd Emperor of the Empire
; 10 years ago
: [[Anrel]] is living in [[Kaarst]] having been raised by the church there
; <10 years ago
: [[Mirark]]'s tiefling friend disappears
; 8 years ago
: [[Amnon Ingolidan]] begins working at [[Squall's Beacon]]; [[Felosiel Teinithra]] and [[Ruda Frank]] marry
; 7 years ago
: [[Anrel]] leads his platoon into [[Ùrlar Valley]] to investigate a strange excavation; he is the only survivor
; 6–7 years ago
: [[Felosiel Teinithra]] becomes captain of [[Kaarst City Watch]]
; ~5 years ago
: [[Kham Gohlrim]] is the only person still speaking to [[Elira Lein]]
; 3 years ago
: [[Eurgaran Wihta]] begins working at [[Squall's Beacon]]; [[Orryn Daergel]] is promoted from Private to Sergeant in [[Kaarst City Watch]]
; 2 years ago
: [[Felosiel Teinithra]] and [[Ruda Frank]] move to their current home
== 1853 Post-Accord ==
; Seanchai
: [[Kham Gohlrim]] departs his post and disappears
; 25 Skaerentsa
: [[Captain Adran Mokam|Captain]] and [[Thava Windreaver|boatswain]] found dead on <i class="ship">[[Hope's Prize]]</i>
; 2 months ago
: [[Beatrux]] is brought to the [[Zaheer island]] as a slave by [[gnoll]]s
; 3 weeks ago
: [[Ser Kobolwitz]]'s [[Claira Hanali|housekeeper]] leaves work to visit family in [[Salzreich]]
; Early Maneseed
: [[Valiant Morgen Trading Company]] purchases a [[Valiant Morgen Trading Company warehouse|warehouse]]
; 19 Maneseed
: Last sighting of [[Father Traulam Eugen]]
; 3 Thirkuoss
: [[Ser Kobolwitz]]'s body found in his [[Kobolwitz Manor|manor]] drawing room
; 10 Thirkuoss
: [[Thodris Holderhek]]'s body found in [[Sombre Lyceum]]
; 15 Thirkuoss
: [[Eurgaran Wihta]] leaves home but does not arrive at [[Squall's Beacon]]
; 17 Thirkuoss
: [[Eurgaran Wihta]]'s body found floating in harbour
; 25 Thirkuoss
: Party arrives at [[gnoll]] camp in [[Aleph Marsh]]
; 26 Thirkuoss
: Slaves are freed from [[gnoll]] camp and sail to [[Meeresdorf]]
; 27 Thirkuoss
: Party arrives on the [[Zaheer island|island]] and escapes the slave camp
; 28 Thirkuoss
: Party meets ghosts and [[troglodyte|lizard-type folk]] in the [[Zaheer island|island]] caves
; 29 Thirkuoss
: [[Srir Silthallow]] is defeated but [[Rrekkeh Stormcrawler]] escapes
; 30 Thirkuoss
: Survivors leave the [[Zaheer island|island]] aboard <i class="ship">[[Dancing in the Storm]]</i>
; 31 Thirkuoss
: <i class="ship">[[Dancing in the Storm]]</i> departs [[Meeresdorf]] for [[Senneborn]]
; 1 Thelliea
: <i class="ship">[[Dancing in the Storm]]</i> arrives in [[Senneborn]]; Party departs for [[Kaarst]]
; 3 Thelliea
: Last sighting of [[Captain Felosial Teinithra]] by [[Sergeant Doudra]]
; 11 Thelliea
: Party arrives in [[Kaarst]], visits [[Kade Sirrine Kathedrale]], [[Mira]] joins
; 12 Thelliea
: Party visits [[Kobolwitz Manor]] and [[Squall's Beacon]]
; 13 Thelliea
: Discovery and stakeout of [[Valiant Morgen warehouse]], [[Ashmaker]] attacks
; 14 Thelliea
: Interrogation of captives, jailbreak of [[Uthan]], meeting [[the Tide]], investigating [[Valiant Morgen Trading Company|Valiant Morgen]]
; 15 Thelliea
: [[Sable Warden]] sends party to [[Acropolis of Karaskaa]], party stops [[Knives of Mystra]] just before sunset, planned meeting of [[Kaarst City Council]] is abandoned
; 16 Thelliea
: <i class="ship">[[Hope's Prize]]</i> was due to depart [[Kaarst]]
; 18 Thelliea
: [[Anrel]] awakes in the [[house of healing]] near [[Kade Sirrine Kathedrale]].
; 19 Thelliea
: The [[Galesong Thervan Indále|Galesong]] and [[Sable Warden Meriele Berevan|Sable Warden]] have a final debrief with the heroes of [[Kaarst]]
388e2b5dfd6f5ef115da24975bf9045555d81103
Ashtkhaan
0
183
311
2024-04-01T22:59:51Z
Vicht
1
Created page with "A comet that orbits [[Talyen]]'s star. It is visible from Talyen for about a week every 600 years, and its last appearance was a [[Timeline|bit over 500 years ago]]. There are ancient legends relating to the comet going back thousands of years to the very oldest stories. [[Ansel]] points it out on [[Suithrathus Luirmo]]'s orrery in the [[Spire of Divination]]. [[Category:Celestial bodies]]"
wikitext
text/x-wiki
A comet that orbits [[Talyen]]'s star. It is visible from Talyen for about a week every 600 years, and its last appearance was a [[Timeline|bit over 500 years ago]]. There are ancient legends relating to the comet going back thousands of years to the very oldest stories. [[Ansel]] points it out on [[Suithrathus Luirmo]]'s orrery in the [[Spire of Divination]].
[[Category:Celestial bodies]]
860398b24300c4185af51766abc3e6518827e4a0
Talyen
0
184
312
2024-04-01T23:16:54Z
Vicht
1
Created page with "One of three planets in its solar system, as depicted on [[Suithrathus Luirmo]]'s orrery in the [[Spire of Divination]]. [[Anrel]] doesn't know the names of the other two planets. The planet has four continents: ; Elengon {{Main|Elengon}} : The continent to the northwest, containing the [[Arkhellen Empire]], [[Fuarcrùn Freeholds]] and other nearby lands. ; Eaos {{Main|Eaos}} : The continent to the southwest ; Savra {{Main|Savra}} : The continent to the northeast ; Cala..."
wikitext
text/x-wiki
One of three planets in its solar system, as depicted on [[Suithrathus Luirmo]]'s orrery in the [[Spire of Divination]]. [[Anrel]] doesn't know the names of the other two planets.
The planet has four continents:
; Elengon
{{Main|Elengon}}
: The continent to the northwest, containing the [[Arkhellen Empire]], [[Fuarcrùn Freeholds]] and other nearby lands.
; Eaos
{{Main|Eaos}}
: The continent to the southwest
; Savra
{{Main|Savra}}
: The continent to the northeast
; Calaha
{{Main|Calaha}}
: The continent to the southeast, containing [[Dhintay]]
The globe in [[Ser Reginald Kobolwitz]]'s [[Kobolwitz Manor#Trophy room|trophy room]] shows all four of these continents. The orrery in the Spire of Divination shows continents that Anrel is not familiar with.
[[Category:Celestial bodies]]
11d8331421ee6ad76eaf72f6e5f3d264f8a036e2
Nessus
0
185
313
2024-04-02T00:40:07Z
Vicht
1
Created page with "The part of the [[Nine Hells]] that [[Vastren]] is from, and to which she is supposed to have returned after being freed, per her contract with [[Mira]] and [[Grokko]]. She describes it as being much lower than the place where [[Etorn Hadaran]] will end up. [[Category:Planes]]"
wikitext
text/x-wiki
The part of the [[Nine Hells]] that [[Vastren]] is from, and to which she is supposed to have returned after being freed, per her contract with [[Mira]] and [[Grokko]]. She describes it as being much lower than the place where [[Etorn Hadaran]] will end up.
[[Category:Planes]]
5386bf229cbc2a138d5f0fd2a925f72b9655e1b5
Eaos
0
186
315
2024-04-02T00:44:56Z
Vicht
1
Created page with "The continent to the southwest on [[Talyen]]. It is south of [[Elengon]] and west of [[Calaha]]. It appears on the globe in [[Ser Reginald Kobolwitz]]'s [[Kobolwitz Manor#Trophy room|trophy room]]. [[Category:Continents]]"
wikitext
text/x-wiki
The continent to the southwest on [[Talyen]]. It is south of [[Elengon]] and west of [[Calaha]]. It appears on the globe in [[Ser Reginald Kobolwitz]]'s [[Kobolwitz Manor#Trophy room|trophy room]].
[[Category:Continents]]
6e7e30422707af1ff2e3978b9270fce0efdb7521
Savra
0
187
316
2024-04-02T00:45:04Z
Vicht
1
Created page with "The continent to the northeast on [[Talyen]]. It is north of [[Calaha]] and east of [[Elengon]]. It appears on the globe in [[Ser Reginald Kobolwitz]]'s [[Kobolwitz Manor#Trophy room|trophy room]]. [[Category:Continents]]"
wikitext
text/x-wiki
The continent to the northeast on [[Talyen]]. It is north of [[Calaha]] and east of [[Elengon]]. It appears on the globe in [[Ser Reginald Kobolwitz]]'s [[Kobolwitz Manor#Trophy room|trophy room]].
[[Category:Continents]]
4af06ef891937d857db3b5881803d436df103708
Calaha
0
188
317
2024-04-02T01:05:13Z
Vicht
1
Created page with "The continent to the southeast on [[Talyen]], containing the country of [[Dhintay]]. It is south of [[Savra]] and east of [[Eaos]]. It appears on the globe in [[Ser Reginald Kobolwitz]]'s [[Kobolwitz Manor#Trophy room|trophy room]]. Ser Kobolwitz wrote of his days hunting in Calaha, including mention of [[gnoll]]s. The [[Book of the Twinned Flame]] is the journal of a mage evaluating rumours of the [[Burning Lord]], a conquering champion weilding divine fire smiting th..."
wikitext
text/x-wiki
The continent to the southeast on [[Talyen]], containing the country of [[Dhintay]]. It is south of [[Savra]] and east of [[Eaos]].
It appears on the globe in [[Ser Reginald Kobolwitz]]'s [[Kobolwitz Manor#Trophy room|trophy room]]. Ser Kobolwitz wrote of his days hunting in Calaha, including mention of [[gnoll]]s.
The [[Book of the Twinned Flame]] is the journal of a mage evaluating rumours of the [[Burning Lord]], a conquering champion weilding divine fire smiting the monsters roaming the deserts of Calaha. The unidenified author wrote of planning to visit Calaha to meet the Burning Lord, but the last pages of their journal do not mention if this occurred.
[[Category:Continents]]
80e7a5b75673f708d7ece3840a5da639ae1ddb73
Spanish
0
189
318
2024-04-02T01:10:24Z
Vicht
1
Created page with "When [[Suithrathus Luirmo]] mentions that [[Elgrex Anderra]] was another [[dragonborn]] Master of the [[Acropolis of Kereskaa]], [[Anrel]] clarifies that ‘Elgrex’ was her first name, and not <b>Spanish</b>. When asked what this word means, he claims it is a land far to the south, at least according to a fantasy novel that he'd read. [[Vichthart]] is unimpressed, stating that as a priest he is only concerned with the truth. For some reason, this makes [[Anrel]] laugh."
wikitext
text/x-wiki
When [[Suithrathus Luirmo]] mentions that [[Elgrex Anderra]] was another [[dragonborn]] Master of the [[Acropolis of Kereskaa]], [[Anrel]] clarifies that ‘Elgrex’ was her first name, and not <b>Spanish</b>. When asked what this word means, he claims it is a land far to the south, at least according to a fantasy novel that he'd read. [[Vichthart]] is unimpressed, stating that as a priest he is only concerned with the truth. For some reason, this makes [[Anrel]] laugh.
b599efb5f51c6c5560a6c2bfef19d5e50bd3042d
File:Crested Eagle.png
6
190
319
2024-04-02T16:36:00Z
Vicht
1
[[The Crested Eagle]]
wikitext
text/x-wiki
== Summary ==
[[The Crested Eagle]]
e9096fd48856d2476e9ddd5163b0480c287b66d4
The Crested Eagle
0
191
320
2024-04-02T16:36:56Z
Vicht
1
Created page with "{{DISPLAYTITLE:<i class="ship">The Crested Eagle</i>}} Merchant ship on which [[Vichthart]] and [[Kenneth]] were passengers while [[Grokko]], [[Preston]], and First Mate [[Lania Falst]] served. It sank off the coast of [[Meeresdorf]] after being caught in an unexpected storm later found to have been caused by the [[gnoll]]s inhabiting a nearby [[Zaheer island|island]]. [[File:Crested_Eagle.png|thumb|center|upright=1|<i class="ship">The Crested Eagle</i>]] Vichthart, Ke..."
wikitext
text/x-wiki
{{DISPLAYTITLE:<i class="ship">The Crested Eagle</i>}}
Merchant ship on which [[Vichthart]] and [[Kenneth]] were passengers while [[Grokko]], [[Preston]], and First Mate [[Lania Falst]] served. It sank off the coast of [[Meeresdorf]] after being caught in an unexpected storm later found to have been caused by the [[gnoll]]s inhabiting a nearby [[Zaheer island|island]].
[[File:Crested_Eagle.png|thumb|center|upright=1|<i class="ship">The Crested Eagle</i>]]
Vichthart, Kenneth and Grokko managed to swim to shore, and between them they managed to carry the unconscious Lania Falst to Meeresdorf. Lania later joined the party to search for other survivors that had been taken to the island, and sure enough they discovered others including [[Preston]] were being enslaved there.
[[Category:Ships]]
cac9fcc76559b4eaeba08869203194cf9eb78e47
Henry Hungleberry
0
192
321
2024-04-02T16:40:25Z
Vicht
1
Created page with "When [[Mira]] asks [[Suithrathus Luirmo]] about a door in the [[Acropolis of Kereskaa#Grand Library|Grand Library]] that very obviously leads back out to the corridor they'd just entered from, [[Anrel]] jokes that the ancient door was actually crafted by this individual."
wikitext
text/x-wiki
When [[Mira]] asks [[Suithrathus Luirmo]] about a door in the [[Acropolis of Kereskaa#Grand Library|Grand Library]] that very obviously leads back out to the corridor they'd just entered from, [[Anrel]] jokes that the ancient door was actually crafted by this individual.
bd39f3583ba14ebb87f04067e6f48f7cb485f841
Kham
0
193
322
2024-04-02T17:17:49Z
Vicht
1
Created page with "Which did you mean? * <b>Kham</b> the main protagonist who has been a member of the party since [[Session 14]] back in 2020? Try looking up [[Anrel|Anrel Salier]] instead. * <b>Kham Gohlrim</b> the unmet backstory character Anrel stole their pseudonym from, causing all sorts of confusion? Here's [[Kham Gohlrim|their article]]."
wikitext
text/x-wiki
Which did you mean?
* <b>Kham</b> the main protagonist who has been a member of the party since [[Session 14]] back in 2020? Try looking up [[Anrel|Anrel Salier]] instead.
* <b>Kham Gohlrim</b> the unmet backstory character Anrel stole their pseudonym from, causing all sorts of confusion? Here's [[Kham Gohlrim|their article]].
9164ba43da61231274977849acc31f3366a466cc
Characters
0
194
323
2024-04-02T17:29:25Z
Vicht
1
Created page with "{{Characters}}"
wikitext
text/x-wiki
{{Characters}}
5d5928cf1e7e12e1a3f3281de89aabe30b8dd2eb
Sessions
0
4
324
4
2024-04-02T17:39:29Z
Vicht
1
Added Session 84, and descriptions for Sessions 13, 78, 81–83, added link to Session 77
wikitext
text/x-wiki
{| class="wikitable"
! scope="col" | Session
! scope="col" | Date
! scope="col" | Summary
|-
| [[Session 1|1]]
| data-sort-value="2020-04-05" | 5 Apr 2020
| <i class="ship">[[The Crested Eagle]]</i> sinks in a storm. [[Kenneth]], [[Grokko]] and [[Vichthart]] reach [[Meeresdorf]].
|-
| [[Session 2|2]]
| data-sort-value="2020-04-19" | 19 Apr 2020
|
|-
| [[Session 3|3]]
| data-sort-value="2020-05-03" | 3 May 2020
| The party kicks some [[goblin|gobbo]] ass.
|-
| [[Session 4|4]]
| data-sort-value="2020-05-17" | 17 May 2020
|
|-
| [[Session 5|5]]
| data-sort-value="2020-06-07" | 7 Jun 2020
|
|-
| [[Session 6|6]]
| data-sort-value="2020-08-02" | 2 Aug 2020
|
|-
| [[Session 7|7]]
| data-sort-value="2020-08-09" | 9 Aug 2020
| The party delivers a message to the [[Judita Bandelmann|harbourmaster]]. Grokko finds a [[cat]].
|-
| [[Session 8|8]]
| data-sort-value="2020-08-16" | 16 Aug 2020
| Kenneth and Grokko trade away their [[Schnellhoof Carriagemaster's|carriage]] booking for a [[The Katz und Imp|nicer inn]].
|-
| [[Session 9|9]]
| data-sort-value="2020-08-23" | 23 Aug 2020
| Kenneth and Grokko identify a suspicious [[Senneborn warehouse|warehouse]] which the team stakes out then breaks into.
|-
| [[Session 10|10]]
| data-sort-value="2020-08-30" | 30 Aug 2020
| The party battles smugglers in the basement of the warehouse.
|-
| [[Session 11|11]]
| data-sort-value="2020-09-13" | 13 Sep 2020
| The party interrogates the surviving smuggler and enters [[Detlef]]'s lair by the secret fireplace entrance.
|-
| [[Session 12|12]]
| data-sort-value="2020-10-04" | 4 Oct 2020
| [[Talyen Tales]]—[[A Band of Brothers]]—[[The Piß Keepers]] lose [[Seebo]] to his gambling debts.
|-
| [[Session 13|13]]
| data-sort-value="2020-10-25" | 25 Oct 2020
| [[A Band of Brothers]] part 2, [[The Piß Keepers]] rescue [[Seebo]] from the mines.
|-
| [[Session 14|14]]
| data-sort-value="2020-11-08" | 8 Nov 2020
|
|-
| [[Session 15|15]]
| data-sort-value="2020-11-14" | 14 Nov 2020
|
|-
| [[Session 16|16]]
| data-sort-value="2020-11-22" | 22 Nov 2020
|
|-
| [[Session 17|17]]
| data-sort-value="2020-12-06" | 6 Dec 2020
|
|-
| [[Session 18|18]]
| data-sort-value="2020-12-13" | 13 Dec 2020
|
|-
| [[Session 19|19]]
| data-sort-value="2020-12-20" | 20 Dec 2020
|
|-
| [[Session 20|20]]
| data-sort-value="2021-01-03" | 3 Jan 2021
|
|-
| [[Session 21|21]]
| data-sort-value="2021-01-10" | 10 Jan 2021
|
|-
| [[Session 22|22]]
| data-sort-value="2021-01-17" | 17 Jan 2021
|
|-
| [[Session 23|23]]
| data-sort-value="2021-02-07" | 7 Feb 2021
|
|-
| [[Session 24|24]]
| data-sort-value="2021-02-14" | 14 Feb 2021
|
|-
| [[Session 25|25]]
| data-sort-value="2021-02-21" | 21 Feb 2021
| [[Droghen]] instructs the party to kill [[Srir]] or he'll destroy [[Meeresdorf]]. He gives them a [[symbol of Bane]] and instructions them to find [[Jenora Greenheart]]. The party trades with the [[faerie dragon]]s then returns to Meeresdorf. [[Kham]] dreams of a demon's lair.
|-
| [[Session 26|26]]
| data-sort-value="2021-03-07" | 7 Mar 2021
| The party meets [[Jenora Greenheart]].
|-
| [[Session 27|27]]
| data-sort-value="2021-03-14" | 14 Mar 2021
| The party faces a [[gnoll]] hunting party.
|-
| [[Session 28|28]]
| data-sort-value="2021-03-21" | 21 Mar 2021
| The party reaches the [[gnoll]] encampment.
|-
| [[Session 29|29]]
| data-sort-value="2021-03-28" | 28 Mar 2021
| The party attacks the [[gnoll]]s in the encampment.
|-
| [[Session 30|30]]
| data-sort-value="2021-04-11" | 11 Apr 2021
| The party begins exploring the tunnels below the [[stone tower]] in the lake and fight a giant [[hyena]]. [[Vichthart]] gets the giggles.
|-
| [[Session 31|31]]
| data-sort-value="2021-04-25" | 25 Apr 2021
| [[Grokko]] desecrates an altar to [[Gruumsh]], a [[gnoll]] packlord carries [[Ogak]]'s head.
|-
| [[Session 32|32]]
| data-sort-value="2021-05-16" | 16 May 2021
| Grokko and Kham sort their loot then head above ground to finish off the [[gnoll]]s and free the [[Dancing in the Storm|ship's]] crew.
|-
| [[Session 33|33]]
| data-sort-value="2021-06-06" | 6 Jun 2021
| Grokko gives [[Jenora Greenheart]] his luck in exchange for [[Szehga]]. Party returns to Meeresdorf.
|-
| [[Session 34|34]]
| data-sort-value="2021-06-27" | 27 Jun 2021
| The party prepares to head to the island on <i class="ship">[[Dancing in the Storm]]</i>.
|-
| [[Session 35|35]]
| data-sort-value="2021-07-04" | 4 Jul 2021
| <i class="ship">Dancing in the Storm</i> travels to the [[Zaheer island|island]].
|-
| [[Session 36|36]]
| data-sort-value="2021-07-25" | 25 Jul 2021
| The party sneaks out of the slave village and into the caves. [[Kham]] recognizes the demon's lair.
|-
| [[Session 37|37]]
| data-sort-value="2021-08-08" | 8 Aug 2021
| The party fights [[demon]]s and [[undead]], finds a spiral catacomb.
|-
| [[Session 38|38]]
| data-sort-value="2021-08-22" | 22 Aug 2021
| The party meets a race of [[troglodyte|lizard-like beings]] and sees the [[giant demon]] for the first time.
|-
| [[Session 39|39]]
| data-sort-value="2021-08-29" | 29 Aug 2021
| Kham finds [[Ingen]]'s satchel. [[Grokko]] and [[Vicht]] flee the [[giant demon]].
|-
| [[Session 40|40]]
| data-sort-value="2021-09-05" | 5 Sep 2021
| Vicht barely contains his righteous anger. Kham nearly falls off a bridge.
|-
| [[Session 41|41]]
| data-sort-value="2021-09-26" | 26 Sep 2021
| Huge numbers of [[gnoll]]s and rats. Grokko loses his hair.
|-
| [[Session 42|42]]
| data-sort-value="2021-10-03" | 3 Oct 2021
| The party avoids [[boar demon]]s and meets [[Kylian]], Keeper of the Temple.
|-
| [[Session 43|43]]
| data-sort-value="2021-10-31" | 31 Oct 2021
| The party frees the first [[throat]] and loots the [[gnoll]]s' dorms.
|-
| [[Session 44|44]]
| data-sort-value="2021-11-07" | 7 Nov 2021
| The party fights [[hyena]]e that turn into [[gnoll]]s, and frees the second [[throat]].
|-
| [[Session 45|45]]
| data-sort-value="2021-11-14" | 14 Nov 2021
| The party frees the final two [[throat]]s.
|-
| [[Session 46|46]]
| data-sort-value="2021-11-28" | 28 Nov 2021
| [[Srir Silthallow]] is killed but [[Rrekkeh Stormcrawler]] escapes.
|-
| [[Session 47|47]]
| data-sort-value="2021-12-05" | 5 Dec 2021
| The slaves have revolted and the demons have vanished.
|-
| [[Session 48|48]]
| data-sort-value="2022-01-02" | 2 Jan 2022
| The party goes to [[Senneborn]] then takes 10 days to travel to [[Kaarst]].
|-
| [[Session 49|49]]
| data-sort-value="2022-01-23" | 23 Jan 2022
| [[Four adventurers]] find the barrow of [[Kaelinu]] and fight [[Will-o'-wisp]]s.
|-
| [[Session 50|50]]
| data-sort-value="2022-01-30" | 30 Jan 2022
| Four adventurers recover the sword of [[Kaelinu]].
|-
| [[Session 51|51]]
| data-sort-value="2022-03-06" | 6 Mar 2022
| 11th [[Thelliea]]: The party arrives in [[Kaarst]] and meets [[Cardinal Silkendawn]].
|-
| [[Session 52|52]]
| data-sort-value="2022-03-20" | 20 Mar 2022
| The party meets [[Mira]] and [[Ginger]] down a dark alley.
|-
| [[Session 53|53]]
| data-sort-value="2022-04-10" | 10 Apr 2022
| An [[Iron Tempest]] group from [[Havenhaft]] protects a farm from [[orc]]s.
|-
| [[Session 54|54]]
| data-sort-value="2022-04-24" | 24 Apr 2022
| 12th [[Thelliea]]: Examining [[Sombre Lyceum]] and murder victims' bodies.
|-
| [[Session 55|55]]
| data-sort-value="2022-05-22" | 22 May 2022
| The party is kicked out of [[Squall's Beacon]] and enters [[Kobolwitz Manor]].
|-
| [[Session 56|56]]
| data-sort-value="2022-06-19" | 19 Jun 2022
| The party explores the upstairs of [[Kobolwitz Manor]].
|-
| [[Session 57|57]]
| data-sort-value="2022-07-10" | 10 Jul 2022
| Clues in the basement of [[Kobolwitz Manor]]. Mira encounters a [[mimic]].
|-
| [[Session 58|58]]
| data-sort-value="2022-07-24" | 24 Jul 2022
| Return to [[Squall's Beacon]].
|-
| [[Session 59|59]]
| data-sort-value="2022-09-11" | 11 Sep 2022
| [[false stalactite|Stalactites]] and [[grey ooze|oily puddles]] attack in the long-lost sewers of [[Kaarst]].
|-
| [[Session 60|60]]
| data-sort-value="2022-09-18" | 18 Sep 2022
| Mind-controlled [[ghoul]]s attack; [[Eurgaran Wihta]]'s fingers are found.
|-
| [[Session 61|61]]
| data-sort-value="2022-10-16" | 16 Oct 2022
| Grokko buys a potion from [[Tiaathque's Medicinal Remedies|Tiaathque's]], Kham summons [[Grimm]].
|-
| [[Session 62|62]]
| data-sort-value="2022-10-23" | 23 Oct 2022
| Acting [[Captain Daergel]] gives addresses, [[Captain Teneithra]]'s husband.
|-
| [[Session 63|63]]
| data-sort-value="2022-10-30" | 30 Oct 2022
| [[Waterworks Guild]] can't give a map, sewer in alley where [[Captain Teneithra|Cpt]] was jumped.
|-
| [[Session 64|64]]
| data-sort-value="2022-12-04" | 4 Dec 2022
| Footprints in the sewers lead to a [[warehouse]]. [[Mira]] and [[Grokko]] stake it out.
|-
| [[Session 65|65]]
| data-sort-value="2022-12-18" | 18 Dec 2022
| [[Vicht]] and [[Kham]] are ambushed by wizards, Grokko gets bitten.
|-
| [[Session 66|66]]
| data-sort-value="2023-01-08" | 8 Jan 2023
| Assailants are taken to jail but no one attacks [[the Copper Roost]].
|-
| [[Session 67|67]]
| data-sort-value="2023-03-05" | 5 Mar 2023
| Captives are questioned, and a jailbreak is made for [[Uthan]].
|-
| [[Session 68|68]]
| data-sort-value="2023-03-19" | 19 Mar 2023
| [[Irann Rhogar]] arranges for a tour of <i class="ship">[[Hope's Prize]]</i>.
|-
| [[Session 69|69]]
| data-sort-value="2023-04-16" | 16 Apr 2023
| First meeting with [[the Tide]] at [[Baron's Casket]].
|-
| [[Session 70|70]]
| data-sort-value="2023-05-28" | 28 May 2023
| All aboard <i class="ship">[[Hope's Prize]]</i>.
|-
| [[Session 71|71]]
| data-sort-value="2023-06-04" | 4 Jun 2023
| Attacked by three [[vampire]]s, <i class="ship">[[Hope's Prize]]</i> sinks.
|-
| [[Session 72|72]]
| data-sort-value="2023-06-11" | 11 Jun 2023
| Exploring the [[Valiant Morgen Trading Company headquarters]].
|-
| [[Session 73|73]]
| data-sort-value="2023-06-25" | 25 Jun 2023
| Mira and Grokko have dreams.
|-
| [[Session 74|74]]
| data-sort-value="2023-08-13" | 13 Aug 2023
| The [[Sable Warden]] debriefs and prepares, Kham is revealed.
|-
| [[Session 75|75]]
| data-sort-value="2023-09-24" | 24 Sep 2023
| [[Nothing]]s and a [[devil]] appear in the [[Acropolis of Kereskaa|underground towers]].
|-
| [[Session 76|76]]
| data-sort-value="2023-10-01" | 1 Oct 2023
| Meeting [[Suithrathus Luirmo]], Master of [[Divination]]
|-
| [[Session 77|77]]
| data-sort-value="2023-10-15" | 15 Oct 2023
| [[Mira]] loses all his money (and some height) to a [[mirror]]
|-
| [[Session 78|78]]
| data-sort-value="2023-11-12" | 12 Nov 2023
| Discovering [[Toross Rhistel]], [[Vastren]] and the vault
|-
| [[Session 79|79]]
| data-sort-value="2023-11-26" | 26 Nov 2023
| Crossing the fallen [[Spire of Necromancy]] to find [[Leagallow Tiaathque]].
|-
| [[Session 80|80]]
| data-sort-value="2023-12-03" | 3 Dec 2023
| The [[Obsidian Claw]] is recovered from the vaults.
|-
| [[Session 81|81]]
| data-sort-value="2024-01-14" | 14 Jan 2024
| Party rests and evaluates their assets, enters the [[Spire of Abjuration]]
|-
| [[Session 82|82]]
| data-sort-value="2024-03-03" | 3 Mar 2024
| Deaths of [[Etorn Hadarin]], [[Irann Rhogar]] and [[Heathress Erenbund]]
|-
| [[Session 83|83]]
| data-sort-value="2024-03-17" | 17 Mar 2024
| [[Grokko]] grabs the [[Feywild shard]], [[Anrel]] communes with [[Zaheer]], the [[bone devil]] dies
|-
| [[Session 84|84]]
| data-sort-value="2024-03-31" | 31 Mar 2024
| Deals with [[Leagallow Tiaathque|Tiaathque]] and [[Vastren]], [[Anrel]] confronts [[Cardinal Silkendawn]], [[Orianna]] learns about [[Arnuanna]]
|-
|}
1c94d6879570dae70b7b136378e2be23ed19cb29
325
324
2024-04-02T17:42:35Z
Vicht
1
wikitext
text/x-wiki
{| class="wikitable"
! scope="col" | Session
! scope="col" | Date
! scope="col" | Summary
|-
| [[Session 1|1]]
| data-sort-value="2020-04-05" | 5 Apr 2020
| <i class="ship">[[The Crested Eagle]]</i> sinks in a storm. [[Kenneth]], [[Grokko]] and [[Vichthart]] reach [[Meeresdorf]].
|-
| [[Session 2|2]]
| data-sort-value="2020-04-19" | 19 Apr 2020
|
|-
| [[Session 3|3]]
| data-sort-value="2020-05-03" | 3 May 2020
| The party kicks some [[goblin|gobbo]] ass.
|-
| [[Session 4|4]]
| data-sort-value="2020-05-17" | 17 May 2020
|
|-
| [[Session 5|5]]
| data-sort-value="2020-06-07" | 7 Jun 2020
|
|-
| [[Session 6|6]]
| data-sort-value="2020-08-02" | 2 Aug 2020
|
|-
| [[Session 7|7]]
| data-sort-value="2020-08-09" | 9 Aug 2020
| The party delivers a message to the [[Judita Bandelmann|harbourmaster]]. Grokko finds a [[cat]].
|-
| [[Session 8|8]]
| data-sort-value="2020-08-16" | 16 Aug 2020
| Kenneth and Grokko trade away their [[Schnellhoof Carriagemaster's|carriage]] booking for a [[The Katz und Imp|nicer inn]].
|-
| [[Session 9|9]]
| data-sort-value="2020-08-23" | 23 Aug 2020
| Kenneth and Grokko identify a suspicious [[Senneborn warehouse|warehouse]] which the team stakes out then breaks into.
|-
| [[Session 10|10]]
| data-sort-value="2020-08-30" | 30 Aug 2020
| The party battles smugglers in the basement of the warehouse.
|-
| [[Session 11|11]]
| data-sort-value="2020-09-13" | 13 Sep 2020
| The party interrogates the surviving smuggler and enters [[Detlef]]'s lair by the secret fireplace entrance.
|-
| [[Session 12|12]]
| data-sort-value="2020-10-04" | 4 Oct 2020
| [[Talyen Tales]]—[[A Band of Brothers]]—[[The Piß Keepers]] lose [[Seebo]] to his gambling debts.
|-
| [[Session 13|13]]
| data-sort-value="2020-10-25" | 25 Oct 2020
| [[A Band of Brothers]] part 2, [[The Piß Keepers]] rescue [[Seebo]] from the mines.
|-
| [[Session 14|14]]
| data-sort-value="2020-11-08" | 8 Nov 2020
|
|-
| [[Session 15|15]]
| data-sort-value="2020-11-14" | 14 Nov 2020
|
|-
| [[Session 16|16]]
| data-sort-value="2020-11-22" | 22 Nov 2020
|
|-
| [[Session 17|17]]
| data-sort-value="2020-12-06" | 6 Dec 2020
|
|-
| [[Session 18|18]]
| data-sort-value="2020-12-13" | 13 Dec 2020
|
|-
| [[Session 19|19]]
| data-sort-value="2020-12-20" | 20 Dec 2020
|
|-
| [[Session 20|20]]
| data-sort-value="2021-01-03" | 3 Jan 2021
|
|-
| [[Session 21|21]]
| data-sort-value="2021-01-10" | 10 Jan 2021
|
|-
| [[Session 22|22]]
| data-sort-value="2021-01-17" | 17 Jan 2021
|
|-
| [[Session 23|23]]
| data-sort-value="2021-02-07" | 7 Feb 2021
|
|-
| [[Session 24|24]]
| data-sort-value="2021-02-14" | 14 Feb 2021
|
|-
| [[Session 25|25]]
| data-sort-value="2021-02-21" | 21 Feb 2021
| [[Droghen]] instructs the party to kill [[Srir]] or he'll destroy [[Meeresdorf]]. He gives them a [[symbol of Bane]] and instructions them to find [[Jenora Greenheart]]. The party trades with the [[faerie dragon]]s then returns to Meeresdorf. [[Kham]] dreams of a demon's lair.
|-
| [[Session 26|26]]
| data-sort-value="2021-03-07" | 7 Mar 2021
| The party meets [[Jenora Greenheart]].
|-
| [[Session 27|27]]
| data-sort-value="2021-03-14" | 14 Mar 2021
| The party faces a [[gnoll]] hunting party.
|-
| [[Session 28|28]]
| data-sort-value="2021-03-21" | 21 Mar 2021
| The party reaches the [[gnoll]] encampment.
|-
| [[Session 29|29]]
| data-sort-value="2021-03-28" | 28 Mar 2021
| The party attacks the [[gnoll]]s in the encampment.
|-
| [[Session 30|30]]
| data-sort-value="2021-04-11" | 11 Apr 2021
| The party begins exploring the tunnels below the [[stone tower]] in the lake and fight a giant [[hyena]]. [[Vichthart]] gets the giggles.
|-
| [[Session 31|31]]
| data-sort-value="2021-04-25" | 25 Apr 2021
| [[Grokko]] desecrates an altar to [[Gruumsh]], a [[gnoll]] packlord carries [[Ogak]]'s head.
|-
| [[Session 32|32]]
| data-sort-value="2021-05-16" | 16 May 2021
| Grokko and Kham sort their loot then head above ground to finish off the [[gnoll]]s and free the [[Dancing in the Storm|ship's]] crew.
|-
| [[Session 33|33]]
| data-sort-value="2021-06-06" | 6 Jun 2021
| Grokko gives [[Jenora Greenheart]] his luck in exchange for [[Szehga]]. Party returns to Meeresdorf.
|-
| [[Session 34|34]]
| data-sort-value="2021-06-27" | 27 Jun 2021
| The party prepares to head to the island on <i class="ship">[[Dancing in the Storm]]</i>.
|-
| [[Session 35|35]]
| data-sort-value="2021-07-04" | 4 Jul 2021
| <i class="ship">Dancing in the Storm</i> travels to the [[Zaheer island|island]].
|-
| [[Session 36|36]]
| data-sort-value="2021-07-25" | 25 Jul 2021
| The party sneaks out of the slave village and into the caves. [[Kham]] recognizes the demon's lair.
|-
| [[Session 37|37]]
| data-sort-value="2021-08-08" | 8 Aug 2021
| The party fights [[demon]]s and [[undead]], finds a spiral catacomb.
|-
| [[Session 38|38]]
| data-sort-value="2021-08-22" | 22 Aug 2021
| The party meets a race of [[troglodyte|lizard-like beings]] and sees the [[giant demon]] for the first time.
|-
| [[Session 39|39]]
| data-sort-value="2021-08-29" | 29 Aug 2021
| Kham finds [[Ingen]]'s satchel. [[Grokko]] and [[Vicht]] flee the [[giant demon]].
|-
| [[Session 40|40]]
| data-sort-value="2021-09-05" | 5 Sep 2021
| Vicht barely contains his righteous anger. Kham nearly falls off a bridge.
|-
| [[Session 41|41]]
| data-sort-value="2021-09-26" | 26 Sep 2021
| Huge numbers of [[gnoll]]s and rats. Grokko loses his hair.
|-
| [[Session 42|42]]
| data-sort-value="2021-10-03" | 3 Oct 2021
| The party avoids [[boar demon]]s and meets [[Kylian]], Keeper of the Temple.
|-
| [[Session 43|43]]
| data-sort-value="2021-10-31" | 31 Oct 2021
| The party frees the first [[throat]] and loots the [[gnoll]]s' dorms.
|-
| [[Session 44|44]]
| data-sort-value="2021-11-07" | 7 Nov 2021
| The party fights [[hyena]]e that turn into [[gnoll]]s, and frees the second [[throat]].
|-
| [[Session 45|45]]
| data-sort-value="2021-11-14" | 14 Nov 2021
| The party frees the final two [[throat]]s.
|-
| [[Session 46|46]]
| data-sort-value="2021-11-28" | 28 Nov 2021
| [[Srir Silthallow]] is killed but [[Rrekkeh Stormcrawler]] escapes.
|-
| [[Session 47|47]]
| data-sort-value="2021-12-05" | 5 Dec 2021
| The slaves have revolted and the demons have vanished.
|-
| [[Session 48|48]]
| data-sort-value="2022-01-02" | 2 Jan 2022
| The party goes to [[Senneborn]] then takes 10 days to travel to [[Kaarst]].
|-
| [[Session 49|49]]
| data-sort-value="2022-01-23" | 23 Jan 2022
| [[Talyen Tales]]—[[Dragon Barrow]]—Four adventurers find the barrow of [[Kaelinu]] and fight [[Will-o'-wisp]]s.
|-
| [[Session 50|50]]
| data-sort-value="2022-01-30" | 30 Jan 2022
| [[Dragon Barrow]] part 2, four adventurers recover the sword of [[Kaelinu]].
|-
| [[Session 51|51]]
| data-sort-value="2022-03-06" | 6 Mar 2022
| 11th [[Thelliea]]: The party arrives in [[Kaarst]] and meets [[Cardinal Silkendawn]].
|-
| [[Session 52|52]]
| data-sort-value="2022-03-20" | 20 Mar 2022
| The party meets [[Mira]] and [[Ginger]] down a dark alley.
|-
| [[Session 53|53]]
| data-sort-value="2022-04-10" | 10 Apr 2022
| [[Talyen Tales]]—An [[Iron Tempest]] group from [[Havenhaft]] protects a farm from [[orc]]s.
|-
| [[Session 54|54]]
| data-sort-value="2022-04-24" | 24 Apr 2022
| 12th [[Thelliea]]: Examining [[Sombre Lyceum]] and murder victims' bodies.
|-
| [[Session 55|55]]
| data-sort-value="2022-05-22" | 22 May 2022
| The party is kicked out of [[Squall's Beacon]] and enters [[Kobolwitz Manor]].
|-
| [[Session 56|56]]
| data-sort-value="2022-06-19" | 19 Jun 2022
| The party explores the upstairs of [[Kobolwitz Manor]].
|-
| [[Session 57|57]]
| data-sort-value="2022-07-10" | 10 Jul 2022
| Clues in the basement of [[Kobolwitz Manor]]. Mira encounters a [[mimic]].
|-
| [[Session 58|58]]
| data-sort-value="2022-07-24" | 24 Jul 2022
| Return to [[Squall's Beacon]].
|-
| [[Session 59|59]]
| data-sort-value="2022-09-11" | 11 Sep 2022
| [[false stalactite|Stalactites]] and [[grey ooze|oily puddles]] attack in the long-lost sewers of [[Kaarst]].
|-
| [[Session 60|60]]
| data-sort-value="2022-09-18" | 18 Sep 2022
| Mind-controlled [[ghoul]]s attack; [[Eurgaran Wihta]]'s fingers are found.
|-
| [[Session 61|61]]
| data-sort-value="2022-10-16" | 16 Oct 2022
| Grokko buys a potion from [[Tiaathque's Medicinal Remedies|Tiaathque's]], Kham summons [[Grimm]].
|-
| [[Session 62|62]]
| data-sort-value="2022-10-23" | 23 Oct 2022
| Acting [[Captain Daergel]] gives addresses, [[Captain Teneithra]]'s husband.
|-
| [[Session 63|63]]
| data-sort-value="2022-10-30" | 30 Oct 2022
| [[Waterworks Guild]] can't give a map, sewer in alley where [[Captain Teneithra|Cpt]] was jumped.
|-
| [[Session 64|64]]
| data-sort-value="2022-12-04" | 4 Dec 2022
| Footprints in the sewers lead to a [[warehouse]]. [[Mira]] and [[Grokko]] stake it out.
|-
| [[Session 65|65]]
| data-sort-value="2022-12-18" | 18 Dec 2022
| [[Vicht]] and [[Kham]] are ambushed by wizards, Grokko gets bitten.
|-
| [[Session 66|66]]
| data-sort-value="2023-01-08" | 8 Jan 2023
| Assailants are taken to jail but no one attacks [[the Copper Roost]].
|-
| [[Session 67|67]]
| data-sort-value="2023-03-05" | 5 Mar 2023
| Captives are questioned, and a jailbreak is made for [[Uthan]].
|-
| [[Session 68|68]]
| data-sort-value="2023-03-19" | 19 Mar 2023
| [[Irann Rhogar]] arranges for a tour of <i class="ship">[[Hope's Prize]]</i>.
|-
| [[Session 69|69]]
| data-sort-value="2023-04-16" | 16 Apr 2023
| First meeting with [[the Tide]] at [[Baron's Casket]].
|-
| [[Session 70|70]]
| data-sort-value="2023-05-28" | 28 May 2023
| All aboard <i class="ship">[[Hope's Prize]]</i>.
|-
| [[Session 71|71]]
| data-sort-value="2023-06-04" | 4 Jun 2023
| Attacked by three [[vampire]]s, <i class="ship">[[Hope's Prize]]</i> sinks.
|-
| [[Session 72|72]]
| data-sort-value="2023-06-11" | 11 Jun 2023
| Exploring the [[Valiant Morgen Trading Company headquarters]].
|-
| [[Session 73|73]]
| data-sort-value="2023-06-25" | 25 Jun 2023
| Mira and Grokko have dreams.
|-
| [[Session 74|74]]
| data-sort-value="2023-08-13" | 13 Aug 2023
| The [[Sable Warden]] debriefs and prepares, Kham is revealed.
|-
| [[Session 75|75]]
| data-sort-value="2023-09-24" | 24 Sep 2023
| [[Nothing]]s and a [[devil]] appear in the [[Acropolis of Kereskaa|underground towers]].
|-
| [[Session 76|76]]
| data-sort-value="2023-10-01" | 1 Oct 2023
| Meeting [[Suithrathus Luirmo]], Master of [[Divination]]
|-
| [[Session 77|77]]
| data-sort-value="2023-10-15" | 15 Oct 2023
| [[Mira]] loses all his money (and some height) to a [[mirror]]
|-
| [[Session 78|78]]
| data-sort-value="2023-11-12" | 12 Nov 2023
| Discovering [[Toross Rhistel]], [[Vastren]] and the vault
|-
| [[Session 79|79]]
| data-sort-value="2023-11-26" | 26 Nov 2023
| Crossing the fallen [[Spire of Necromancy]] to find [[Leagallow Tiaathque]].
|-
| [[Session 80|80]]
| data-sort-value="2023-12-03" | 3 Dec 2023
| The [[Obsidian Claw]] is recovered from the vaults.
|-
| [[Session 81|81]]
| data-sort-value="2024-01-14" | 14 Jan 2024
| Party rests and evaluates their assets, enters the [[Spire of Abjuration]]
|-
| [[Session 82|82]]
| data-sort-value="2024-03-03" | 3 Mar 2024
| Deaths of [[Etorn Hadarin]], [[Irann Rhogar]] and [[Heathress Erenbund]]
|-
| [[Session 83|83]]
| data-sort-value="2024-03-17" | 17 Mar 2024
| [[Grokko]] grabs the [[Feywild shard]], [[Anrel]] communes with [[Zaheer]], the [[bone devil]] dies
|-
| [[Session 84|84]]
| data-sort-value="2024-03-31" | 31 Mar 2024
| Deals with [[Leagallow Tiaathque|Tiaathque]] and [[Vastren]], [[Anrel]] confronts [[Cardinal Silkendawn]], [[Orianna]] learns about [[Arnuanna]]
|-
|}
4c28f12f41e72cd9afa5d76a752eb6b74e4756c0
Locations
0
195
326
2024-04-02T17:43:14Z
Vicht
1
Created page with "{{Locations}}"
wikitext
text/x-wiki
{{Locations}}
a2d56e27b43d9e791f5a2ec3adfb26575f759be4
Achima
0
196
327
2024-04-02T21:30:15Z
Vicht
1
Created page with "A thug in [[Kaarst]] working under [[Ertus]]. Ertus instructs them to search [[Mira]]'s robes. Unknown if they escaped or were knocked unconscious in the alley."
wikitext
text/x-wiki
A thug in [[Kaarst]] working under [[Ertus]]. Ertus instructs them to search [[Mira]]'s robes. Unknown if they escaped or were knocked unconscious in the alley.
e2c7a82c00f91696423b6963cf4477e93a033275
Bogdan
0
197
328
2024-04-02T21:32:14Z
Vicht
1
Created page with "Brother of [[Bogdin]] and thug in [[Kaarst]] working under [[Ertus]]. Initially tried to flee from the alley after [[Mira]] cast [[Hunger of Hadar]] but was tripped up by [[Anrel]]'s whip."
wikitext
text/x-wiki
Brother of [[Bogdin]] and thug in [[Kaarst]] working under [[Ertus]]. Initially tried to flee from the alley after [[Mira]] cast [[Hunger of Hadar]] but was tripped up by [[Anrel]]'s whip.
cea31593ffd9e0d58173f7f40bf3d1e662abcf65
Bogdin
0
198
329
2024-04-02T21:33:02Z
Vicht
1
Created page with "Brother of [[Bogdan]] and thug in [[Kaarst]] working under [[Ertus]]. While inside the inky blackness of [[Hunger of Hadar]], he accidentally slashes at one of his fellow thugs. He is the last thug left in the alley with Ertus, and manages to escape along with him. Claimed his name was Bogdan while Bogdan was visibly lying on the floor."
wikitext
text/x-wiki
Brother of [[Bogdan]] and thug in [[Kaarst]] working under [[Ertus]]. While inside the inky blackness of [[Hunger of Hadar]], he accidentally slashes at one of his fellow thugs. He is the last thug left in the alley with Ertus, and manages to escape along with him. Claimed his name was Bogdan while Bogdan was visibly lying on the floor.
f23f17742506135a0054fee5d8db9c8f529e4db0
Kham Gohlrim
0
199
330
2024-04-03T01:25:42Z
Vicht
1
Created page with "A member of [[Verein Kirche von Arkhelle]] who recommended [[Anrel Salier]], although [[Cardinal Maurul Silkendawn]] never could understand why. They were not part of the platoon that Anrel led into the [[Ùrlar Valley]], and remained in [[Kaarst]] after Anrel disappeared. After a couple of years, he was the only person still talking to [[Elira Lein]], although she suspected this was only because he knew that Elira knew Anrel, who he was looking for, and said he was abse..."
wikitext
text/x-wiki
A member of [[Verein Kirche von Arkhelle]] who recommended [[Anrel Salier]], although [[Cardinal Maurul Silkendawn]] never could understand why. They were not part of the platoon that Anrel led into the [[Ùrlar Valley]], and remained in [[Kaarst]] after Anrel disappeared. After a couple of years, he was the only person still talking to [[Elira Lein]], although she suspected this was only because he knew that Elira knew Anrel, who he was looking for, and said he was absent more than he was around. Six months before the [[bone devil]] was defeated in large part due to Anrel, <b>Kham</b> left their post and disappeared, although Elira didn't seem to be aware of this. Cardinal Silkendawn reported this to Anrel, along with his belief that Kham will have gone to Ùrlar Valley.
When [[Grokko]], [[Kenneth]] and [[Vichthart]] first meet and free Anrel from the sewers beneath [[Senneborn]], he only gives his name as Kham, which he continues to use as his name to them and to others all the way until he kills the bone devil. When he asks [[Leagallow Tiaathque]] to tell Elira Lein he visited, he gives his name as <b>Kham Gohlrim</b>. When he later meets Elira in the shop, [[Mira]] tries to understand why they both start talking about Kham in the third person. Elira tells Anrel that Kham is back in town and has sent him a letter, then when Mira calls Anrel ‘Kham’, she realizes with dismay that Anrel has been using Kham's name as a pseudonym.
Anrel suggests to Elira that Kham could protect her, but she is not confident of this, believing they've only remained in as little contact as they have due to Kham's desire to find Anrel. Elira claims that ‘he’ is still sending people up north, which sounds like she means Kham, but might also refer to Cardinal Silkendawn.
[[Category:Members of Verein Kirche von Arkhelle]]
[[Category:Missing persons]]
7c57887fca32f8f292f1c498563ba6c6fb8031eb
Spire of Divination
0
200
331
2024-04-04T11:33:58Z
Vicht
1
Redirected page to [[Spire#Spire of Divination]]
wikitext
text/x-wiki
#REDIRECT [[Spire#Spire of Divination]]
75932d576f7cde9051ff69feedd0ec9a7d1e4018
Spire of Illusion
0
201
332
2024-04-04T11:34:48Z
Vicht
1
Redirected page to [[Spire#Spire of Illusion]]
wikitext
text/x-wiki
#REDIRECT [[Spire#Spire of Illusion]]
4c78c54477f5d5440b3305ee284ac5952e06627c
Spire of Conjuration
0
202
333
2024-04-04T11:35:22Z
Vicht
1
Redirected page to [[Spire#Spire of Conjuration]]
wikitext
text/x-wiki
#REDIRECT [[Spire#Spire of Conjuration]]
5c33d096e06debfac691550ad628e8eeb95c3c1e
Spire of Abjuration
0
203
334
2024-04-04T11:36:09Z
Vicht
1
Redirected page to [[Spire#Spire of Abjuration]]
wikitext
text/x-wiki
#REDIRECT [[Spire#Spire of Abjuration]]
1ebf2bee36edfd9fa07d4431c3c6c105ff706bba
Spire of Evocation
0
204
335
2024-04-04T11:36:41Z
Vicht
1
Redirected page to [[Spire#Spire of Evocation]]
wikitext
text/x-wiki
#REDIRECT [[Spire#Spire of Evocation]]
352e176426500c7cff3206642ec33afbdac21767
Spire of Transmutation
0
205
336
2024-04-04T11:38:00Z
Vicht
1
Redirected page to [[Spire#Spire of Transmutation]]
wikitext
text/x-wiki
#REDIRECT [[Spire#Spire of Transmutation]]
55232434050378d3fd6dfc95fd6633d6cdc0e7ae
Spire of Enchantment
0
206
337
2024-04-04T11:38:31Z
Vicht
1
Redirected page to [[Spire#Spire of Enchantment]]
wikitext
text/x-wiki
#REDIRECT [[Spire#Spire of Enchantment]]
c19eaf40b5b9430990c8863d698895182cab9d76
Spire of Necromancy
0
207
338
2024-04-04T11:39:05Z
Vicht
1
Redirected page to [[Spire#Spire of Necromancy]]
wikitext
text/x-wiki
#REDIRECT [[Spire#Spire of Necromancy]]
b6241c021667afc336da14c5360e01a7ab7ab380
Altar of Necromancy
0
155
339
269
2024-04-04T12:26:09Z
Vicht
1
Changed redirect target from [[Spire of Necromancy]] to [[Spire#Spire of Necromancy]]
wikitext
text/x-wiki
#REDIRECT [[Spire#Spire of Necromancy]]
b6241c021667afc336da14c5360e01a7ab7ab380
Altar of Enchantment
0
159
340
273
2024-04-04T12:27:04Z
Vicht
1
Changed redirect target from [[Spire of Enchantment]] to [[Spire#Spire of Enchantment]]
wikitext
text/x-wiki
#REDIRECT [[Spire#Spire of Enchantment]]
c19eaf40b5b9430990c8863d698895182cab9d76
Altar of Evocation
0
157
341
271
2024-04-04T12:27:35Z
Vicht
1
Changed redirect target from [[Spire of Evocation]] to [[Spire#Spire of Evocation]]
wikitext
text/x-wiki
#REDIRECT [[Spire#Spire of Evocation]]
352e176426500c7cff3206642ec33afbdac21767
Altar of Abjuration
0
156
342
270
2024-04-04T12:27:59Z
Vicht
1
Changed redirect target from [[Spire of Abjuration]] to [[Spire#Spire of Abjuration]]
wikitext
text/x-wiki
#REDIRECT [[Spire#Spire of Abjuration]]
1ebf2bee36edfd9fa07d4431c3c6c105ff706bba
Altar of Conjuration
0
153
343
267
2024-04-04T12:28:35Z
Vicht
1
Changed redirect target from [[Spire of Conjuration]] to [[Spire#Spire of Conjuration]]
wikitext
text/x-wiki
#REDIRECT [[Spire#Spire of Conjuration]]
5c33d096e06debfac691550ad628e8eeb95c3c1e
Altar of Illusion
0
158
344
272
2024-04-04T12:29:00Z
Vicht
1
Changed redirect target from [[Spire of Illusion]] to [[Spire#Spire of Illusion]]
wikitext
text/x-wiki
#REDIRECT [[Spire#Spire of Illusion]]
4c78c54477f5d5440b3305ee284ac5952e06627c
Altar of Transmutation
0
152
345
266
2024-04-04T12:29:32Z
Vicht
1
Changed redirect target from [[Spire of Transmutation]] to [[Spire#Spire of Transmutation]]
wikitext
text/x-wiki
#REDIRECT [[Spire#Spire of Transmutation]]
55232434050378d3fd6dfc95fd6633d6cdc0e7ae
Altar of Divination
0
154
346
268
2024-04-04T12:29:59Z
Vicht
1
Changed redirect target from [[Spire of Divination]] to [[Spire#Spire of Divination]]
wikitext
text/x-wiki
#REDIRECT [[Spire#Spire of Divination]]
75932d576f7cde9051ff69feedd0ec9a7d1e4018
Kythera
0
208
347
2024-04-04T12:47:40Z
Vicht
1
Created page with "A flying city of mages, capable of moving across the land and launching arcane attacks on anything below. Its people, along with [[Teklanna Morantine]], were responsible for the attack on the [[Acropolis of Kereskaa]]. When defending Kaarst's ban on magic to [[Grokko]], [[Sable Warden Meriele Berevan]] described a city larger than [[Kaarst]] floating through the air on a rock larger than any mountain, it being armed with all manner of arcane ability to scorch the earth...."
wikitext
text/x-wiki
A flying city of mages, capable of moving across the land and launching arcane attacks on anything below. Its people, along with [[Teklanna Morantine]], were responsible for the attack on the [[Acropolis of Kereskaa]].
When defending Kaarst's ban on magic to [[Grokko]], [[Sable Warden Meriele Berevan]] described a city larger than [[Kaarst]] floating through the air on a rock larger than any mountain, it being armed with all manner of arcane ability to scorch the earth. Later, [[Suithrathus Luirmo]] describes <b>Kythera</b> as a flying city of mages, constructed with arcane power. [[Vichthart]] has heard of flying cities, of which there were several being used as weapons of mass destruction in the great wars. Though none are known to remain, there are occasional search parties for them.
Suithrathus visited Kythera where he saw something that impressed him and inspired him to construct his orrery in the [[Spire of Divination]]. He explains that they grew from being persuers of knowledge to persuers of power, and that he later came to realise that the <b>Kytherans</b> had developed a desire to acquire something that the [[Acropolis of Kereskaa]] was protecting, possibly the [[Dragon Orb of Drimysthonantas]]. It was while Suithrathus was using his divining mirror to contemplate this problem that the Kytherans attacked the Acropolis.
3dd19c9bbccc5a6667ce35e5f6dc395dd1c94afa
File:Arnt.png
6
209
348
2024-04-06T12:09:57Z
Vicht
1
[[Arnt]]
wikitext
text/x-wiki
== Summary ==
[[Arnt]]
251cbf9f48f35def38ad7f840e0fbacdc8cdcac1
Arnt
0
210
349
2024-04-06T12:14:24Z
Vicht
1
Created page with "14- or 15-year-old child criminal who works with [[Detlef]]. She discovered him on the streets of [[Kaarst]] 3 years ago. Had a poor experience being raised in religious care homes and so refuses to go back to one, so the party instead recommends he finds work or apprenticeship in [[Senneborn]]. Leads the party to a hidden room behind the prison. [[File:Arnt.png|thumb|center|upright=0.8|Arnt]] [[Category:Criminals working for Droghen]]"
wikitext
text/x-wiki
14- or 15-year-old child criminal who works with [[Detlef]]. She discovered him on the streets of [[Kaarst]] 3 years ago. Had a poor experience being raised in religious care homes and so refuses to go back to one, so the party instead recommends he finds work or apprenticeship in [[Senneborn]]. Leads the party to a hidden room behind the prison.
[[File:Arnt.png|thumb|center|upright=0.8|Arnt]]
[[Category:Criminals working for Droghen]]
5c04625588ff46fa1c854cebf879f467b5242dc2
Bertrand
0
211
350
2024-04-06T12:25:22Z
Vicht
1
Created page with "Smuggler in the basement of the suspicious [[warehouse]] of [[Senneborn]], who the party keeps alive and interrogates. He lets them know about the secret entrance to the [[Ratway]] behind the fireplace, but doesn’t know how to open it. [[Category:Criminals working for Droghen]]"
wikitext
text/x-wiki
Smuggler in the basement of the suspicious [[warehouse]] of [[Senneborn]], who the party keeps alive and interrogates. He lets them know about the secret entrance to the [[Ratway]] behind the fireplace, but doesn’t know how to open it.
[[Category:Criminals working for Droghen]]
fdc9c8039a6fe9f78010410870cbf570107deec5
Bezur
0
212
351
2024-04-06T12:26:17Z
Vicht
1
Created page with "[[Droghen]] threatens [[Tark]] by saying if he messes up, he’ll be replaced by <b>Bezur</b>. [[Category:Criminals working for Droghen]]"
wikitext
text/x-wiki
[[Droghen]] threatens [[Tark]] by saying if he messes up, he’ll be replaced by <b>Bezur</b>.
[[Category:Criminals working for Droghen]]
75da37b630b098ca8b123ad14f0bb31a6162a463
Bill
0
213
352
2024-04-06T12:28:44Z
Vicht
1
Created page with "Entrance guard at the suspicious [[Senneborn warehouse|warehouse]] in [[Senneborn]]. [[Vichthart]] and [[Grokko]] try to distract him by soliciting donations to [[Verein Kirche von Arkhelle]] on top of their regular tithes. [[Category:Criminals working for Droghen]]"
wikitext
text/x-wiki
Entrance guard at the suspicious [[Senneborn warehouse|warehouse]] in [[Senneborn]]. [[Vichthart]] and [[Grokko]] try to distract him by soliciting donations to [[Verein Kirche von Arkhelle]] on top of their regular tithes.
[[Category:Criminals working for Droghen]]
8c8220cb6edb139a38e9b31abdf84f6735d4c745
Bertrand
0
211
353
350
2024-04-06T12:29:30Z
Vicht
1
Changed link to the warehouse in Senneborn
wikitext
text/x-wiki
Smuggler in the basement of the suspicious [[Senneborn warehouse|warehouse]] of [[Senneborn]], who the party keeps alive and interrogates. He lets them know about the secret entrance to the [[Ratway]] behind the fireplace, but doesn’t know how to open it.
[[Category:Criminals working for Droghen]]
1d210af0380433551ecf302122c42e40acdf53b4
Davin
0
214
354
2024-04-06T12:31:03Z
Vicht
1
Created page with "Smuggler working under [[Detlef]], who stole a necklace and snuck about in restricted places without being caught. Their friend [[Hilta]] urged them to stop misbehaving for their own safety, but they were caught stashing gold elsewhere and were killed for it. [[Category:Criminals working for Droghen]]"
wikitext
text/x-wiki
Smuggler working under [[Detlef]], who stole a necklace and snuck about in restricted places without being caught. Their friend [[Hilta]] urged them to stop misbehaving for their own safety, but they were caught stashing gold elsewhere and were killed for it.
[[Category:Criminals working for Droghen]]
ed124d4dcf0e4ca64dd84c3fcb878b144847be93
Falk
0
215
355
2024-04-06T12:32:31Z
Vicht
1
Created page with "Smuggler in the sewers beneath [[Senneborn]] who struggled to keep the door to the [[Ratway]] shut. Doesn’t trust [[Arnt]]. [[Category:Criminals working for Droghen]]"
wikitext
text/x-wiki
Smuggler in the sewers beneath [[Senneborn]] who struggled to keep the door to the [[Ratway]] shut. Doesn’t trust [[Arnt]].
[[Category:Criminals working for Droghen]]
61ab2e0fa0a446bc7be842e8dd1a00766635329f
Hilta
0
216
356
2024-04-06T12:33:34Z
Vicht
1
Created page with "Smuggler working under [[Detlef]]. Knows that [[Davin]] is skimming off the top and warns him to stop before Detlef finds out. They're unsuccessful, and Davin is caught and killed. [[Category:Criminals working for Droghen]]"
wikitext
text/x-wiki
Smuggler working under [[Detlef]]. Knows that [[Davin]] is skimming off the top and warns him to stop before Detlef finds out. They're unsuccessful, and Davin is caught and killed.
[[Category:Criminals working for Droghen]]
ca3b9921bd8d6a6145ee6f6249fb485cb09fdcf0
Jochim
0
217
357
2024-04-06T12:43:27Z
Vicht
1
Created page with "Smuggler decently respected by [[Detlef]], especially for his dealings with [[Droghen]]. Attacks the party with 3 crossbowers as they approach [[Senneborn]], thus drawing their attention to the [[bandit camp]] outside town. [[Category:Criminals working for Droghen]]"
wikitext
text/x-wiki
Smuggler decently respected by [[Detlef]], especially for his dealings with [[Droghen]]. Attacks the party with 3 crossbowers as they approach [[Senneborn]], thus drawing their attention to the [[bandit camp]] outside town.
[[Category:Criminals working for Droghen]]
19cb4c675b3823cd997ef75a18c138e7af7ba094
Knuth
0
218
358
2024-04-06T12:44:24Z
Vicht
1
Created page with "[[Hobgoblin]] jailer of [[Droghen's keep]]. The party was forewarned about how cruel he was, and his chamber contained many tools of torture. Unusually, as he was being killed, he seemed to enjoy the experience of pain. The ‘K‘ in his name is not silent. [[Category:Criminals working for Droghen]]"
wikitext
text/x-wiki
[[Hobgoblin]] jailer of [[Droghen's keep]]. The party was forewarned about how cruel he was, and his chamber contained many tools of torture. Unusually, as he was being killed, he seemed to enjoy the experience of pain. The ‘K‘ in his name is not silent.
[[Category:Criminals working for Droghen]]
118ba33a3ea605ec05e2ff7ac69a45ccaec2edf4
365
358
2024-04-06T14:15:07Z
Vicht
1
Added to Category:Hobgoblins
wikitext
text/x-wiki
[[Hobgoblin]] jailer of [[Droghen's keep]]. The party was forewarned about how cruel he was, and his chamber contained many tools of torture. Unusually, as he was being killed, he seemed to enjoy the experience of pain. The ‘K‘ in his name is not silent.
[[Category:Criminals working for Droghen]]
[[Category:Hobgoblins]]
787e86b1c24b9fcc2edebe6ae02099effe070f62
Ogak
0
219
359
2024-04-06T12:51:33Z
Vicht
1
Created page with "[[Hobgoblin]] in the [[gnoll encampment]] who is somehow expecting the party's arrival. He is the leader of Droghen's forces in the camp, and the other [[goblin]]s and hobgoblins don't attack the party even without them having to show their [[symbol of Bane]]. <b>Ogak</b> describes the layout and situation to the party. Later his head is seen worn on a [[gnoll]]'s belt. [[Category:Criminals working for Droghen]]"
wikitext
text/x-wiki
[[Hobgoblin]] in the [[gnoll encampment]] who is somehow expecting the party's arrival. He is the leader of Droghen's forces in the camp, and the other [[goblin]]s and hobgoblins don't attack the party even without them having to show their [[symbol of Bane]]. <b>Ogak</b> describes the layout and situation to the party. Later his head is seen worn on a [[gnoll]]'s belt.
[[Category:Criminals working for Droghen]]
7a8a5c70aa1b42a3a59eb22bb6c429e02c9fbe71
366
359
2024-04-06T14:15:39Z
Vicht
1
wikitext
text/x-wiki
[[Hobgoblin]] in the [[gnoll encampment]] who is somehow expecting the party's arrival. He is the leader of Droghen's forces in the camp, and the other [[goblin]]s and hobgoblins don't attack the party even without them having to show their [[symbol of Bane]]. <b>Ogak</b> describes the layout and situation to the party. Later his head is seen worn on a [[gnoll]]'s belt.
[[Category:Criminals working for Droghen]]
[[Category:Hobgoblins]]
bba7c9d762af8086cd88e67427ba6a5c737536e7
Spotter
0
220
360
2024-04-06T13:38:42Z
Vicht
1
Created page with "[[Kenku]] who works under [[Detlef]] in [[Senneborn]]. Possibly the one who keeps control of the lever and the bars from their stool at the end of a long corridor. [[Category:Criminals working for Droghen]]"
wikitext
text/x-wiki
[[Kenku]] who works under [[Detlef]] in [[Senneborn]]. Possibly the one who keeps control of the lever and the bars from their stool at the end of a long corridor.
[[Category:Criminals working for Droghen]]
79a21cde1910883d2e32adea128370d31d754a14
367
360
2024-04-06T14:16:30Z
Vicht
1
wikitext
text/x-wiki
[[Kenku]] who works under [[Detlef]] in [[Senneborn]]. Possibly the one who keeps control of the lever and the bars from their stool at the end of a long corridor.
[[Category:Criminals working for Droghen]]
[[Category:Kenku]]
9187dce76e949e528bd8af842f3981735493ec7f
Swiper
0
221
361
2024-04-06T13:39:12Z
Vicht
1
Created page with "[[Kenku]] who works under [[Detlef]] in [[Senneborn]]. Possibly the one who pickpockets on the streets. [[Category:Criminals working for Droghen]]"
wikitext
text/x-wiki
[[Kenku]] who works under [[Detlef]] in [[Senneborn]]. Possibly the one who pickpockets on the streets.
[[Category:Criminals working for Droghen]]
98b41f94456779c994ab1b59db339669135976da
368
361
2024-04-06T14:16:40Z
Vicht
1
wikitext
text/x-wiki
[[Kenku]] who works under [[Detlef]] in [[Senneborn]]. Possibly the one who pickpockets on the streets.
[[Category:Criminals working for Droghen]]
[[Category:Kenku]]
8f7af562078089b22418540dc1e1bdfdde5be003
Category:Gods of Verein Kirche von Arkhelle
14
222
362
2024-04-06T14:13:08Z
Vicht
1
Created page with "[[Category:Gods]]"
wikitext
text/x-wiki
[[Category:Gods]]
50386964eccf49396c76074e0b5c728988938797
Talxa
0
223
363
2024-04-06T14:13:27Z
Vicht
1
Created page with "[[Goblin]] priestess who hides in [[Droghen's keep]], worshipping a [[:Category:Gods|god]] forbidden amongst the underlings of [[Droghen]], who are forced to worship [[Bane]] alone. She requested that the party killed [[Droghen]]. [[Category:Criminals working for Droghen]]"
wikitext
text/x-wiki
[[Goblin]] priestess who hides in [[Droghen's keep]], worshipping a [[:Category:Gods|god]] forbidden amongst the underlings of [[Droghen]], who are forced to worship [[Bane]] alone. She requested that the party killed [[Droghen]].
[[Category:Criminals working for Droghen]]
f411c4d93b764b43f66bae204eaff33edade055b
369
363
2024-04-06T14:16:48Z
Vicht
1
wikitext
text/x-wiki
[[Goblin]] priestess who hides in [[Droghen's keep]], worshipping a [[:Category:Gods|god]] forbidden amongst the underlings of [[Droghen]], who are forced to worship [[Bane]] alone. She requested that the party killed [[Droghen]].
[[Category:Criminals working for Droghen]]
[[Category:Goblins]]
2e1b4bcdc92440428ae8ad1b5b8e40ca7c849862
Tark
0
3
364
3
2024-04-06T14:14:16Z
Vicht
1
wikitext
text/x-wiki
[[Bugbear]] running the cargo collection hideout near [[Meeresdorf]], whose attack with a mace knocks [[Vichthart]] unconscious and leaves a permanent sun-shaped scar on his chest. He is swiftly killed by [[Grokko]] and [[Kenneth]]. [[Droghen]] had written to <b>Tark</b> directly, threatening to replace him with [[Bezur]] if he messed up.
[[Category:Bugbears]]
[[Category:Criminals working for Droghen]]
ebb1d6b5fc65219c5ad307d380d4ef2d3dab2c96
Vantan
0
224
370
2024-04-06T14:25:17Z
Vicht
1
Created page with "[[Half-elf]] spellcaster who works for [[Droghen]] and [[Detlef]]. He can move about very fast, either due to magic or hidden passages. When confronting the party, he actually does not attack them but [[Anrel]] gives him a bloody nose. When the party finds an instruction note signed by <b>V</b> in the secret basement of [[Kobolwitz Manor]], [[Vichthart]] wonders if it was written by <b>Vantan</b>. However, it turns out to be a pseudonym of [[Orianna]]'s. Category:Crim..."
wikitext
text/x-wiki
[[Half-elf]] spellcaster who works for [[Droghen]] and [[Detlef]]. He can move about very fast, either due to magic or hidden passages. When confronting the party, he actually does not attack them but [[Anrel]] gives him a bloody nose.
When the party finds an instruction note signed by <b>V</b> in the secret basement of [[Kobolwitz Manor]], [[Vichthart]] wonders if it was written by <b>Vantan</b>. However, it turns out to be a pseudonym of [[Orianna]]'s.
[[Category:Criminals working for Droghen]]
9e3c4c18a453359e65ea89cc083a4595b33c7e93
371
370
2024-04-06T14:26:05Z
Vicht
1
Added to Category:Half-elves
wikitext
text/x-wiki
[[Half-elf]] spellcaster who works for [[Droghen]] and [[Detlef]]. He can move about very fast, either due to magic or hidden passages. When confronting the party, he actually does not attack them but [[Anrel]] gives him a bloody nose.
When the party finds an instruction note signed by <b>V</b> in the secret basement of [[Kobolwitz Manor]], [[Vichthart]] wonders if it was written by <b>Vantan</b>. However, it turns out to be a pseudonym of [[Orianna]]'s.
[[Category:Criminals working for Droghen]]
[[Category:Half-elves]]
b44d0518cc188928a01c1674ecad91319a684fcd
378
371
2024-04-06T17:06:03Z
Vicht
1
Added link to Kobolwitz Manor Tide note
wikitext
text/x-wiki
[[Half-elf]] spellcaster who works for [[Droghen]] and [[Detlef]]. He can move about very fast, either due to magic or hidden passages. When confronting the party, he actually does not attack them but [[Anrel]] gives him a bloody nose.
When the party finds an [[Kobolwitz Manor Tide note|instruction note]] signed by <b>V</b> in the secret basement of [[Kobolwitz Manor]], [[Vichthart]] wonders if it was written by <b>Vantan</b>. However, it turns out to be a pseudonym of [[Orianna]]'s.
[[Category:Criminals working for Droghen]]
[[Category:Half-elves]]
25ec300f38501823059ecab4dbcb39dffbb1c317
Timeline
0
5
372
310
2024-04-06T14:32:37Z
Vicht
1
/* 1853 Post-Accord */ Added date the party made Detlef surrender
wikitext
text/x-wiki
== Ancient history ==
* Age of Great Ruin—soul of a Great Wyrm becomes held by [[Dragon Orb of Drimysthonontas]]
* Age of Enlightenment—[[Squall's Beacon]] constructed in [[Farankaars]]
* [[Kereskaa]] contains Dragon Orb of Drimysthonontas, [[Acropolis of Kereskaa]] built above it
* A servant of [[Corellon]] gifts a [[feywild tree|tree from the Feywild]] to the Acropolis of Kereskaa for ‘a good deed done’
* [[Master Suithrathus Luirmo]] begins his tenure at Acropolis of Kereskaa
* Veteran of the [[Blood Wars]], [[Vastren]] is summoned into the catacomb beneath the [[Spire of ]]
* 576th year of the Age of Enlightenment—[[Teklanna Morantine]] betrays the Acropolis of Kereskaa to the [[Kytheran]]s, who destroy the Acropolis
* [[Tyrant]] rules [[Kaarst]], their statue is collapsed into the bay leaving [[Tyrant's Folly]]
* Age of Decadence—arcane magic is used for unpleasant purposes in Kaarst
* [[Great War]] between gods of good and evil for hundreds of years; flying cities used as weapons
* Thousands of years ago, Great War is ended by [[Divine Accords]]; [[Bahamut]] and [[Teli Monei]] sign
* A little over 500 years ago, the most recent appearance of [[Ashtkaan]]
== Recent history==
; 3 generations ago
: Founding of Arkhellen Empire; 12 churches are united as [[Verein Kirche von Arkhelle]]
; >80 years ago
: Birth of [[Maurul Silkendawn]]
; 55–59 years ago
: Birth of [[Reginald Kobolwitz]]
; 47 years ago
: Birth of [[Traulam Eugen]]
; 35 years ago
: Birth of [[Lorenzo Arkhelle]]
; 12 years ago
: [[King Lorenzo Friedriche Arkhelle XVI]] becomes 3rd Emperor of the Empire
; 10 years ago
: [[Anrel]] is living in [[Kaarst]] having been raised by the church there
; <10 years ago
: [[Mirark]]'s tiefling friend disappears
; 8 years ago
: [[Amnon Ingolidan]] begins working at [[Squall's Beacon]]; [[Felosiel Teinithra]] and [[Ruda Frank]] marry
; 7 years ago
: [[Anrel]] leads his platoon into [[Ùrlar Valley]] to investigate a strange excavation; he is the only survivor
; 6–7 years ago
: [[Felosiel Teinithra]] becomes captain of [[Kaarst City Watch]]
; ~5 years ago
: [[Kham Gohlrim]] is the only person still speaking to [[Elira Lein]]
; 3 years ago
: [[Eurgaran Wihta]] begins working at [[Squall's Beacon]]; [[Orryn Daergel]] is promoted from Private to Sergeant in [[Kaarst City Watch]]
; 2 years ago
: [[Felosiel Teinithra]] and [[Ruda Frank]] move to their current home
== 1853 Post-Accord ==
; Seanchai
: [[Kham Gohlrim]] departs his post and disappears
; 25 Skaerentsa
: [[Captain Adran Mokam|Captain]] and [[Thava Windreaver|boatswain]] found dead on <i class="ship">[[Hope's Prize]]</i>
; 2 months ago
: [[Beatrux]] is brought to the [[Zaheer island]] as a slave by [[gnoll]]s
; 3 weeks ago
: [[Ser Kobolwitz]]'s [[Claira Hanali|housekeeper]] leaves work to visit family in [[Salzreich]]
; Early Maneseed
: [[Valiant Morgen Trading Company]] purchases a [[Valiant Morgen Trading Company warehouse|warehouse]]
; 19 Maneseed
: Last sighting of [[Father Traulam Eugen]]
; 3 Thirkuoss
: [[Ser Kobolwitz]]'s body found in his [[Kobolwitz Manor|manor]] drawing room
; 10 Thirkuoss
: [[Anrel]] cuts off [[Armine Detlef]]'s arm
: [[Thodris Holderhek]]'s body found in [[Sombre Lyceum]]
; 15 Thirkuoss
: [[Eurgaran Wihta]] leaves home but does not arrive at [[Squall's Beacon]]
; 17 Thirkuoss
: [[Eurgaran Wihta]]'s body found floating in harbour
; 25 Thirkuoss
: Party arrives at [[gnoll]] camp in [[Aleph Marsh]]
; 26 Thirkuoss
: Slaves are freed from [[gnoll]] camp and sail to [[Meeresdorf]]
; 27 Thirkuoss
: Party arrives on the [[Zaheer island|island]] and escapes the slave camp
; 28 Thirkuoss
: Party meets ghosts and [[troglodyte|lizard-type folk]] in the [[Zaheer island|island]] caves
; 29 Thirkuoss
: [[Srir Silthallow]] is defeated but [[Rrekkeh Stormcrawler]] escapes
; 30 Thirkuoss
: Survivors leave the [[Zaheer island|island]] aboard <i class="ship">[[Dancing in the Storm]]</i>
; 31 Thirkuoss
: <i class="ship">[[Dancing in the Storm]]</i> departs [[Meeresdorf]] for [[Senneborn]]
; 1 Thelliea
: <i class="ship">[[Dancing in the Storm]]</i> arrives in [[Senneborn]]; Party departs for [[Kaarst]]
; 3 Thelliea
: Last sighting of [[Captain Felosial Teinithra]] by [[Sergeant Doudra]]
; 11 Thelliea
: Party arrives in [[Kaarst]], visits [[Kade Sirrine Kathedrale]], [[Mira]] joins
; 12 Thelliea
: Party visits [[Kobolwitz Manor]] and [[Squall's Beacon]]
; 13 Thelliea
: Discovery and stakeout of [[Valiant Morgen warehouse]], [[Ashmaker]] attacks
; 14 Thelliea
: Interrogation of captives, jailbreak of [[Uthan]], meeting [[the Tide]], investigating [[Valiant Morgen Trading Company|Valiant Morgen]]
; 15 Thelliea
: [[Sable Warden]] sends party to [[Acropolis of Karaskaa]], party stops [[Knives of Mystra]] just before sunset, planned meeting of [[Kaarst City Council]] is abandoned
; 16 Thelliea
: <i class="ship">[[Hope's Prize]]</i> was due to depart [[Kaarst]]
; 18 Thelliea
: [[Anrel]] awakes in the [[house of healing]] near [[Kade Sirrine Kathedrale]].
; 19 Thelliea
: The [[Galesong Thervan Indále|Galesong]] and [[Sable Warden Meriele Berevan|Sable Warden]] have a final debrief with the heroes of [[Kaarst]]
d7cd8d76821df2c5a9e5e8c7cb0840e8b966264d
373
372
2024-04-06T14:34:13Z
Vicht
1
/* Recent history */ Added Armine Detlet finding Arnt on the streets
wikitext
text/x-wiki
== Ancient history ==
* Age of Great Ruin—soul of a Great Wyrm becomes held by [[Dragon Orb of Drimysthonontas]]
* Age of Enlightenment—[[Squall's Beacon]] constructed in [[Farankaars]]
* [[Kereskaa]] contains Dragon Orb of Drimysthonontas, [[Acropolis of Kereskaa]] built above it
* A servant of [[Corellon]] gifts a [[feywild tree|tree from the Feywild]] to the Acropolis of Kereskaa for ‘a good deed done’
* [[Master Suithrathus Luirmo]] begins his tenure at Acropolis of Kereskaa
* Veteran of the [[Blood Wars]], [[Vastren]] is summoned into the catacomb beneath the [[Spire of ]]
* 576th year of the Age of Enlightenment—[[Teklanna Morantine]] betrays the Acropolis of Kereskaa to the [[Kytheran]]s, who destroy the Acropolis
* [[Tyrant]] rules [[Kaarst]], their statue is collapsed into the bay leaving [[Tyrant's Folly]]
* Age of Decadence—arcane magic is used for unpleasant purposes in Kaarst
* [[Great War]] between gods of good and evil for hundreds of years; flying cities used as weapons
* Thousands of years ago, Great War is ended by [[Divine Accords]]; [[Bahamut]] and [[Teli Monei]] sign
* A little over 500 years ago, the most recent appearance of [[Ashtkaan]]
== Recent history==
; 3 generations ago
: Founding of Arkhellen Empire; 12 churches are united as [[Verein Kirche von Arkhelle]]
; >80 years ago
: Birth of [[Maurul Silkendawn]]
; 55–59 years ago
: Birth of [[Reginald Kobolwitz]]
; 47 years ago
: Birth of [[Traulam Eugen]]
; 35 years ago
: Birth of [[Lorenzo Arkhelle]]
; 12 years ago
: [[King Lorenzo Friedriche Arkhelle XVI]] becomes 3rd Emperor of the Empire
; 10 years ago
: [[Anrel]] is living in [[Kaarst]] having been raised by the church there
; <10 years ago
: [[Mirark]]'s tiefling friend disappears
; 8 years ago
: [[Amnon Ingolidan]] begins working at [[Squall's Beacon]]; [[Felosiel Teinithra]] and [[Ruda Frank]] marry
; 7 years ago
: [[Anrel]] leads his platoon into [[Ùrlar Valley]] to investigate a strange excavation; he is the only survivor
; 6–7 years ago
: [[Felosiel Teinithra]] becomes captain of [[Kaarst City Watch]]
; ~5 years ago
: [[Kham Gohlrim]] is the only person still speaking to [[Elira Lein]]
; 3 years ago
: [[Eurgaran Wihta]] begins working at [[Squall's Beacon]]; [[Orryn Daergel]] is promoted from Private to Sergeant in [[Kaarst City Watch]]
: [[Armine Detlef]] discovers [[Arnt]] on the streets of [[Kaarst]]
; 2 years ago
: [[Felosiel Teinithra]] and [[Ruda Frank]] move to their current home
== 1853 Post-Accord ==
; Seanchai
: [[Kham Gohlrim]] departs his post and disappears
; 25 Skaerentsa
: [[Captain Adran Mokam|Captain]] and [[Thava Windreaver|boatswain]] found dead on <i class="ship">[[Hope's Prize]]</i>
; 2 months ago
: [[Beatrux]] is brought to the [[Zaheer island]] as a slave by [[gnoll]]s
; 3 weeks ago
: [[Ser Kobolwitz]]'s [[Claira Hanali|housekeeper]] leaves work to visit family in [[Salzreich]]
; Early Maneseed
: [[Valiant Morgen Trading Company]] purchases a [[Valiant Morgen Trading Company warehouse|warehouse]]
; 19 Maneseed
: Last sighting of [[Father Traulam Eugen]]
; 3 Thirkuoss
: [[Ser Kobolwitz]]'s body found in his [[Kobolwitz Manor|manor]] drawing room
; 10 Thirkuoss
: [[Anrel]] cuts off [[Armine Detlef]]'s arm
: [[Thodris Holderhek]]'s body found in [[Sombre Lyceum]]
; 15 Thirkuoss
: [[Eurgaran Wihta]] leaves home but does not arrive at [[Squall's Beacon]]
; 17 Thirkuoss
: [[Eurgaran Wihta]]'s body found floating in harbour
; 25 Thirkuoss
: Party arrives at [[gnoll]] camp in [[Aleph Marsh]]
; 26 Thirkuoss
: Slaves are freed from [[gnoll]] camp and sail to [[Meeresdorf]]
; 27 Thirkuoss
: Party arrives on the [[Zaheer island|island]] and escapes the slave camp
; 28 Thirkuoss
: Party meets ghosts and [[troglodyte|lizard-type folk]] in the [[Zaheer island|island]] caves
; 29 Thirkuoss
: [[Srir Silthallow]] is defeated but [[Rrekkeh Stormcrawler]] escapes
; 30 Thirkuoss
: Survivors leave the [[Zaheer island|island]] aboard <i class="ship">[[Dancing in the Storm]]</i>
; 31 Thirkuoss
: <i class="ship">[[Dancing in the Storm]]</i> departs [[Meeresdorf]] for [[Senneborn]]
; 1 Thelliea
: <i class="ship">[[Dancing in the Storm]]</i> arrives in [[Senneborn]]; Party departs for [[Kaarst]]
; 3 Thelliea
: Last sighting of [[Captain Felosial Teinithra]] by [[Sergeant Doudra]]
; 11 Thelliea
: Party arrives in [[Kaarst]], visits [[Kade Sirrine Kathedrale]], [[Mira]] joins
; 12 Thelliea
: Party visits [[Kobolwitz Manor]] and [[Squall's Beacon]]
; 13 Thelliea
: Discovery and stakeout of [[Valiant Morgen warehouse]], [[Ashmaker]] attacks
; 14 Thelliea
: Interrogation of captives, jailbreak of [[Uthan]], meeting [[the Tide]], investigating [[Valiant Morgen Trading Company|Valiant Morgen]]
; 15 Thelliea
: [[Sable Warden]] sends party to [[Acropolis of Karaskaa]], party stops [[Knives of Mystra]] just before sunset, planned meeting of [[Kaarst City Council]] is abandoned
; 16 Thelliea
: <i class="ship">[[Hope's Prize]]</i> was due to depart [[Kaarst]]
; 18 Thelliea
: [[Anrel]] awakes in the [[house of healing]] near [[Kade Sirrine Kathedrale]].
; 19 Thelliea
: The [[Galesong Thervan Indále|Galesong]] and [[Sable Warden Meriele Berevan|Sable Warden]] have a final debrief with the heroes of [[Kaarst]]
944414745ace59644ebc1c64d387b23b173427ed
Armine Detlef
0
225
374
2024-04-06T14:46:36Z
Vicht
1
Created page with "Criminal leader in [[Senneborn]], works under [[Droghen]] but very high ranking. Wears splint armour, wields a heavy crossbow and has very confident body language. She wants more pay from Droghen because she understands (or thinks she does) the limits of what can be stolen without attracting too much unwanted attention. She left a note about [[Davin]]'s theft and death, which [[Grokko]] found when taking 2 [[bottles of ale]]. After [[Anrel]] is freed from the [[Ratway]]..."
wikitext
text/x-wiki
Criminal leader in [[Senneborn]], works under [[Droghen]] but very high ranking. Wears splint armour, wields a heavy crossbow and has very confident body language. She wants more pay from Droghen because she understands (or thinks she does) the limits of what can be stolen without attracting too much unwanted attention.
She left a note about [[Davin]]'s theft and death, which [[Grokko]] found when taking 2 [[bottles of ale]]. After [[Anrel]] is freed from the [[Ratway]] and finds her, <b>Detlef</b> offers him a job, which he declines. They defeat her on [[Calendar|10th Thirkuoss]] when Anrel cuts her arm off and she admits defeat, and is taken by [[Kerstin Pletcher]] back to the [[Iron Temple Mercenary Company]].
Looked after [[Arnt]] for 3 years after discovering him on the streets of [[Kaarst]].
In the days after the party killed the [[bone devil]] beneath Kaart, [[Grokko]] realized he had acquired [[Detlef's journal]].
[[Category:Criminals working for Droghen]]
[[Category:People who have lost an arm to Anrel]]
5fdd3046c87947ccaf86076a9e9e78166d77f280
File:Detlef.png
6
226
375
2024-04-06T14:47:43Z
Vicht
1
[[Armine Detlef]]
wikitext
text/x-wiki
== Summary ==
[[Armine Detlef]]
995b2add8ab2ac36d828856125dd0b61347d7d70
Armine
0
227
376
2024-04-06T14:48:06Z
Vicht
1
Redirected page to [[Armine Detlef]]
wikitext
text/x-wiki
#REDIRECT [[Armine Detlef]]
e4514f789eae4800e02d84bb1274d90f5cd7ae6b
Detlef
0
228
377
2024-04-06T14:48:23Z
Vicht
1
Redirected page to [[Armine Detlef]]
wikitext
text/x-wiki
#REDIRECT [[Armine Detlef]]
e4514f789eae4800e02d84bb1274d90f5cd7ae6b
Notes:Kobolwitz Manor Tide note
100
229
379
2024-04-06T17:08:03Z
Vicht
1
Created page with "J, My informant has confirmed that Kobolwitz did have our quarry in his possession before his demise. You and E are to enter the manor quietly and secure the blade. It will be well hidden – the old man wouldn’t leave it out in the open. You know what eccentric rich fools are like – look for a hidden safe or vault. I’m told the manor is locked up and no one has been inside since someone set off a trap while the place was being cleaned. As long as you don’t al..."
wikitext
text/x-wiki
J,
My informant has confirmed that Kobolwitz did have our quarry in his possession before his demise.
You and E are to enter the manor quietly and secure the blade. It will be well hidden – the old man wouldn’t leave it out in the open. You know what eccentric rich fools are like – look for a hidden safe or vault.
I’m told the manor is locked up and no one has been inside since someone set off a trap while the place was being cleaned. As long as you don’t alert the guards outside, you should have the run of the place.
When quarry is secured, bring it straight back. I’ll be waiting for you in the cask.
A high tide carries opportunity (in elvish)
— V
dd86e80f4ceb67b15b96355d2f35dbefd4d0c65c
Notes:Letter to Tilos
100
231
381
2024-04-06T17:10:33Z
Vicht
1
Created page with "Welcome to the Valiant Morgen Trading Company Tilos! On behalf of the team let me extend a congratulations and warmest welcomes. I'll drop by before lunch and we'll go over all the paperwork in my office; in the meantime please take the morning to get to know your new colleagues. – Caphri"
wikitext
text/x-wiki
Welcome to the Valiant Morgen Trading Company Tilos! On behalf of the team let me extend a congratulations and warmest welcomes. I'll drop by before lunch and we'll go over all the paperwork in my office; in the meantime please take the morning to get to know your new colleagues.
– Caphri
a3c0faa59b79a46798853fefbb82e8a53cc877b7
Notes:Valiant Morgen Trading Company Kaarst Branch noticeboard
100
232
382
2024-04-06T17:12:15Z
Vicht
1
Created page with "Good morning team, Please note that there will be cake and tea (courtesy of Lilly's – yum!) in the staff lounge at lunchtime to celebrate our new team member. – Malte"
wikitext
text/x-wiki
Good morning team,
Please note that there will be cake and tea (courtesy of Lilly's – yum!) in the staff lounge at lunchtime to celebrate our new team member.
– Malte
475ad9796eba6ce046d49fdc2f2ed9faa39c9cbc
Notes:Irann Rhogar's note about Hope's Prize
100
233
383
2024-04-06T17:17:09Z
Vicht
1
Created page with "{{DISPLAYTITLE:Notes:Irann Rhogar's note about <i class="ship">Hope's Prize</i>}} A minor alteration to tomorrow's diary – to comply with an official investigation, we shall be meeting with and escorting 4 fellows around the Hope's Prize shortly after sunset as they carry out an inspection of the vessel. Please ensure the gentlemen receive our utmost hospitality. I expect this should only constitute a short delay to our attendance at tomorrow's council meeting – we s..."
wikitext
text/x-wiki
{{DISPLAYTITLE:Notes:Irann Rhogar's note about <i class="ship">Hope's Prize</i>}}
A minor alteration to tomorrow's diary – to comply with an official investigation, we shall be meeting with and escorting 4 fellows around the Hope's Prize shortly after sunset as they carry out an inspection of the vessel. Please ensure the gentlemen receive our utmost hospitality. I expect this should only constitute a short delay to our attendance at tomorrow's council meeting – we should still be on schedule for our item on the agenda.
– Irann
9897f2e36fdb0bca868cfc0d9bec9125fd179f5e
Notes:Caphri Pilc's note to Antoniya Brosch
100
234
384
2024-04-06T17:19:00Z
Vicht
1
Created page with "Dear Antoniya, during a recent conversation a staff member intimated to me that they had been made to feel uncomfortable by Ms. Erenbund's peculiarities. It was suggested that rather than leaving impersonal notes on desks, perhaps requests could be better made face-to-face? As you have known Heathress longer than me, I thought perhaps you could have a polite word in her ear on this subject? –Regards, Caphri"
wikitext
text/x-wiki
Dear Antoniya, during a recent conversation a staff member intimated to me that they had been made to feel uncomfortable by Ms. Erenbund's peculiarities. It was suggested that rather than leaving impersonal notes on desks, perhaps requests could be better made face-to-face? As you have known Heathress longer than me, I thought perhaps you could have a polite word in her ear on this subject? –Regards, Caphri
f880875358b0e9beb89a7c03ee29f56797aad6c9
Notes:Antoniya Brosch's note to Caphri Pilc
100
235
385
2024-04-06T17:20:38Z
Vicht
1
Created page with "Caphri – regards your letter, it is not for me to launder staff complaints about senior management – that would be your job. Do it. A"
wikitext
text/x-wiki
Caphri – regards your letter, it is not for me to launder staff complaints about senior management – that would be your job. Do it. A
c6936baf7b05e66baf8a045442b2bfd4d8911cde
Notes:Malte Faerber's note to Irann Rhogar
100
236
386
2024-04-06T17:25:24Z
Vicht
1
Created page with "Director Rhogar, On multiple occasions now I have had to field complaints from clients that their shipments of liquor have arrived with a peculiar <s>smell</s> <s>odour</s> pungency. <s>Apparently the whisky connoisseurs have sensitive noses?</s> I have managed to prevent any escalations, but I fear that if this were to continue we would be in danger of losing some very lucrative business. Perhaps the maintenance budget could be stretched so we <s>don't need an open sew..."
wikitext
text/x-wiki
Director Rhogar,
On multiple occasions now I have had to field complaints from clients that their shipments of liquor have arrived with a peculiar <s>smell</s> <s>odour</s> pungency. <s>Apparently the whisky connoisseurs have sensitive noses?</s> I have managed to prevent any escalations, but I fear that if this were to continue we would be in danger of losing some very lucrative business. Perhaps the maintenance budget could be stretched so we <s>don't need an open sewer grate</s> can find an alternative ventilation solution for the warehouse?
Malte
d911660202729b025f6847ade96bfe6e33d33855
File:Droghen.png
6
237
387
2024-04-07T15:38:47Z
Vicht
1
[[Droghen]]
wikitext
text/x-wiki
== Summary ==
[[Droghen]]
ac263fee0f62ba6aea7e1cf9f707295879f222a7
Droghen
0
238
388
2024-04-07T15:41:09Z
Vicht
1
Created page with "Leader of an organized crime network in [[Western Scharn]] (at least), with many [[goblin]], [[hobgoblin]] and [[bugbear]] underlings, but also highly trusted [[human]] and [[half-elf]] members like [[Detlef]] and [[Vantan]]. When the party infiltrates his [[Droghen's keep|keep]], they are overwhelmed by his forces but are allowed to leave after hearing and accepting his proposal to them. In return for their lives, he gave them the option of locating and killing the gn..."
wikitext
text/x-wiki
Leader of an organized crime network in [[Western Scharn]] (at least), with many [[goblin]], [[hobgoblin]] and [[bugbear]] underlings, but also highly trusted [[human]] and [[half-elf]] members like [[Detlef]] and [[Vantan]].
When the party infiltrates his [[Droghen's keep|keep]], they are overwhelmed by his forces but are allowed to leave after hearing and accepting his proposal to them. In return for their lives, he gave them the option of locating and killing the gnoll [[Srir Silthallow]], saying that she had arrived in his territory and made a deal with him. This deal involved Srir's [[gnoll]] pack being given a certain freedom as well as protection by Droghen's forces, and in return they would use their abilities to sink ships off the coast near [[Meeresdorf]] for Droghen's underlings to capture the shipwrecked crew and cargo.
[[File:Droghen.png|thumb|center|upright=0.65|Droghen]]
<b>Droghen</b> understood that Srir's powers came from the worshipping and summoning of [[demon]]s, and he wanted to have this power for himself. If the party killed Srir, it would leave Droghen free to acquire that power for himself. Since [[Anrel]] and [[Vichthart]] were entirely aware of the dangers of demons being brought to the [[material plane]], the party agreed to Droghen's terms so they could eliminate the threat. Droghen told them that due to a separate arrangement he'd made, he was unable to tell the party how to locate Srir. Instead, he could only advise them to speak to [[Jenora Greenheart]] in [[Aleph Marsh]].
As insurance, Droghen threatened to destroy Meeresdorf if they didn't uphold their end of the bargain, or if they told the people of Meeresdorf of the threat Droghen had made against them. While Anrel, [[Grokko]] and Vichthart made their way to Aleph Marsh, [[Kenneth]] stayed in Meeresdorf to protect the people there in case Droghen ever attacked.
So that Droghen's forces across Western Scharn wouldn't attack the party, he gave them a [[Symbol of Bane]] to present, which his underlings would be informed remotely meant they should cooperate with the party bearting it. He also tells the party that they are to refrain from killing any more goblins.
When the party kills Srir and [[Rrekkeh Stormcrawler]] flees, [[Szegha Silthallow]] reassures the party that Droghen will not be able to acquire their power to summon and control demons. The party takes her word for it and does not ever return to Droghen.
[[Category:Hobgoblins]]
e2cc890f3a82cf2a860685cb91caeb9342f52f24
Zaheer
0
43
389
50
2024-04-07T16:21:34Z
Vicht
1
wikitext
text/x-wiki
The <b>Raging Tempest</b>, the <b>Mercurial Master of the Tempest</b>, god of Storm and Sea, known well to all who encounter storms in their travels. One of the twelve gods of [[Verein Kirche von Arkhelle]]. They have many depictions including male, female, and genderless, but they are consistently wrapped in shawls and robes, with long hair, all caught up in a wind. Depicted in colours of seagreen and deep grey and blue, frequently described as having great wings like a roc, or carrying a great stave of dark wood. <b>Zaheer</b> is known to be quite mercurial, and is prayed to for safe passage over the seas, but commands their followers to be resilient and devout.
When the party begins travelling to [[Senneborn]] to prevent any more ships attempting to approach [[Meeresdorf]], [[Vichthart]] asks [[Sarenrae]] to keep Zaheer protective of the waters to prevent any further shipwrecks while they travel. It later turns out the [[Zaheer island|island]] that [[Szegha Silthallow]] and [[Rrekkeh Stormcrawler]] are operating from used to house a temple to Zaheer built into the mountain. The [[gnoll]]s corrupt it using [[demon]]ic powers to create the unnatural storms. With the help of [[Kylian]] and the [[throat]]s, the party puts a stop to this.
Along with [[Bahamut]] and the [[Raven Queen]], their church is strongly represented in [[Kaarst]], including by [[Galesong Thervan Indále]], one of the leading clerics at [[Kade Sirrine Kathedrale]]. [[Squall's Beacon]] is dedicated to Zaheer, and their followers volunteer and pay respects there throughout the night. Volunteers there include devout dockworker [[Eurgaran Wihta]] (deceased) and [[Amnon Ingolidan]], as well as secret vampire [[Eldon Garrick]].
== Anrel ==
When the party tours Squall's Beacon, [[Anrel]] looks into the light of the beacon and registers it as cool and softly comforting, despite recognizing it as powerful magic. When the others head into the basement (and [[Mira]] discovers a section of hollow floor), Anrel remains on the ground level and pays his respects to Zaheer, unseen by his friends.
When a sting by the [[bone devil]] fills Anrel's body with poison and he falls unconscious underwater, he sees a flash of light above and swims upwards to find himself in a dark, endless ocean, the sky above him black and filled with thundering storm clouds. A voice carried by the wind asks him ‘You have called out to me, and now me to you. Who are you?’ and he answers ‘Anrel’. He swims against the current towards a small rocky island with a thin, gnarled tree covered in tattered cloth. As he looks up, the tree is replaced by a figure covered in shawls and long, white hair, streaming in the wind but unflinching. It asks him ‘Why do you fight?’, to which Anrel answers ‘To protect. For justice.’
When Anrel reaches the rocky shore, the figure is stood at the pinnacle of the island, it features seeming to change whenever a strand of cloth or hair blows in front of it, but they have wild and mad eyes like a goat's, black with white irises that seem to carry energy. It asks him ‘The strength to weather storms is not given, but earnt. Are you worthy?’ Anrel answers, ‘I guess I'll have to prove myself,’ and reaches for the figure's hand. He sees that it is covered in scars and tattoos in patterns of scattered waves and swirling wind, constantly shifting under its skin. When it next speaks, it's voice doesn't come from its lips but as a deep cracking of thunder that drowns out the surrounding noise: ‘Then prove it.’
When [[Grokko]] pulls Anrel to the surface, his armour is sparkling with electric energy, and when his eyes flutter open, luminous wings of crackling lightning sprout from his back. From somewhere above the cavern, everyone hears a sound like a crack of thunder. After killing the bone devil, Anrel's wings disappear and he falls unconscious to the ground. He does so again when he reaches the surface streets of Kaarst, and is taken to a [[house of healing]] where he takes three days to regain consciousness.
As the party learns, when they heard the crack of thunder underground, that was a bolt of lightning striking Squall's Beacon during a freak sudden storm, and it briefly shone with a burst of searing blue light without taking any damage. In the days that followed, a greater number of people were visiting the lighthouse and leaving tokens of their appreciation. Vichthart also noted that the glowing markings on the building's stone exterior were glowing brighter than they had before.
Galesong Thervan Indále recognized the intervention of Zaheer, and having likely heard the accounts of the rest of the party, was present in Anrel's room when he woke from his recovery (as was [[Cardinal Maurul Silkendawn]], but the Cardinal waited for the Galesong to finish his conversation with Anrel and depart before speaking). He points out the spiderweb of scars now present on Anrel's arms, and says that he believes Zaheer has reached out and touched Anrel. He offers to help Anrel in any way that seems necessary, even if that is only information and a pointer in the right direction, suggesting the [[Fenwar Twins]] in [[Aern]] as a next destination. Anrel points out that he is no longer comfortable with religious symbols or organizations, but the Galesong points out that Zaheer values those who stand for themselves and carve their own path. He ends up agreeing with Anrel that they will jointly visit Squall's Beacon before Anrel leaves Kaart.
The next day, when [[Orianna]] invites the party to get drunk, Anrel declines, saying that he will instead visit Squall's Beacon.
[[Category:Gods of Verein Kirche von Arkhelle]]
d41308ea0e503b4560cc5e618e96ac11fd20f850
390
389
2024-04-07T16:26:19Z
Vicht
1
Added Twin Cardinals Fenwar to description
wikitext
text/x-wiki
The <b>Raging Tempest</b>, the <b>Mercurial Master of the Tempest</b>, god of Storm and Sea, known well to all who encounter storms in their travels. One of the twelve gods of [[Verein Kirche von Arkhelle]]. They have many depictions including male, female, and genderless, but they are consistently wrapped in shawls and robes, with long hair, all caught up in a wind. Depicted in colours of seagreen and deep grey and blue, frequently described as having great wings like a roc, or carrying a great stave of dark wood. <b>Zaheer</b> is known to be quite mercurial, and is prayed to for safe passage over the seas, but commands their followers to be resilient and devout.
When the party begins travelling to [[Senneborn]] to prevent any more ships attempting to approach [[Meeresdorf]], [[Vichthart]] asks [[Sarenrae]] to keep Zaheer protective of the waters to prevent any further shipwrecks while they travel. It later turns out the [[Zaheer island|island]] that [[Szegha Silthallow]] and [[Rrekkeh Stormcrawler]] are operating from used to house a temple to Zaheer built into the mountain. The [[gnoll]]s corrupt it using [[demon]]ic powers to create the unnatural storms. With the help of [[Kylian]] and the [[throat]]s, the party puts a stop to this.
Along with [[Bahamut]] and the [[Raven Queen]], their church is strongly represented in [[Kaarst]], including by [[Galesong Thervan Indále]], one of the leading clerics at [[Kade Sirrine Kathedrale]]. [[Squall's Beacon]] is dedicated to Zaheer, and their followers volunteer and pay respects there throughout the night. Volunteers there include devout dockworker [[Eurgaran Wihta]] (deceased) and [[Amnon Ingolidan]], as well as secret vampire [[Eldon Garrick]]. However, the seat of the Twin Cardinals of Zaheer is in [[Aern]], where the [[Fenwar Twins]] are based.
== Anrel ==
When the party tours Squall's Beacon, [[Anrel]] looks into the light of the beacon and registers it as cool and softly comforting, despite recognizing it as powerful magic. When the others head into the basement (and [[Mira]] discovers a section of hollow floor), Anrel remains on the ground level and pays his respects to Zaheer, unseen by his friends.
When a sting by the [[bone devil]] fills Anrel's body with poison and he falls unconscious underwater, he sees a flash of light above and swims upwards to find himself in a dark, endless ocean, the sky above him black and filled with thundering storm clouds. A voice carried by the wind asks him ‘You have called out to me, and now me to you. Who are you?’ and he answers ‘Anrel’. He swims against the current towards a small rocky island with a thin, gnarled tree covered in tattered cloth. As he looks up, the tree is replaced by a figure covered in shawls and long, white hair, streaming in the wind but unflinching. It asks him ‘Why do you fight?’, to which Anrel answers ‘To protect. For justice.’
When Anrel reaches the rocky shore, the figure is stood at the pinnacle of the island, it features seeming to change whenever a strand of cloth or hair blows in front of it, but they have wild and mad eyes like a goat's, black with white irises that seem to carry energy. It asks him ‘The strength to weather storms is not given, but earnt. Are you worthy?’ Anrel answers, ‘I guess I'll have to prove myself,’ and reaches for the figure's hand. He sees that it is covered in scars and tattoos in patterns of scattered waves and swirling wind, constantly shifting under its skin. When it next speaks, it's voice doesn't come from its lips but as a deep cracking of thunder that drowns out the surrounding noise: ‘Then prove it.’
When [[Grokko]] pulls Anrel to the surface, his armour is sparkling with electric energy, and when his eyes flutter open, luminous wings of crackling lightning sprout from his back. From somewhere above the cavern, everyone hears a sound like a crack of thunder. After killing the bone devil, Anrel's wings disappear and he falls unconscious to the ground. He does so again when he reaches the surface streets of Kaarst, and is taken to a [[house of healing]] where he takes three days to regain consciousness.
As the party learns, when they heard the crack of thunder underground, that was a bolt of lightning striking Squall's Beacon during a freak sudden storm, and it briefly shone with a burst of searing blue light without taking any damage. In the days that followed, a greater number of people were visiting the lighthouse and leaving tokens of their appreciation. Vichthart also noted that the glowing markings on the building's stone exterior were glowing brighter than they had before.
Galesong Thervan Indále recognized the intervention of Zaheer, and having likely heard the accounts of the rest of the party, was present in Anrel's room when he woke from his recovery (as was [[Cardinal Maurul Silkendawn]], but the Cardinal waited for the Galesong to finish his conversation with Anrel and depart before speaking). He points out the spiderweb of scars now present on Anrel's arms, and says that he believes Zaheer has reached out and touched Anrel. He offers to help Anrel in any way that seems necessary, even if that is only information and a pointer in the right direction, proposing the Fenwar Twins in Aern as his next destination. Anrel points out that he is no longer comfortable with religious symbols or organizations, but the Galesong points out that Zaheer values those who stand for themselves and carve their own path. He ends up agreeing with Anrel that they will jointly visit Squall's Beacon before Anrel leaves Kaart.
The next day, when [[Orianna]] invites the party to get drunk, Anrel declines, saying that he will instead visit Squall's Beacon.
[[Category:Gods of Verein Kirche von Arkhelle]]
bc40ee6d3c9205a44e73fbd20b423ae173ce4cc3
Cralw
0
239
391
2024-04-10T00:33:22Z
Vicht
1
Created page with "Small village in [[Western Scharn]], just west off the road leading south from [[Salzreich]] into [[Brenhalt]]. It sits in the middle of the hilly southern part of Western Scharn. {{Locations}}"
wikitext
text/x-wiki
Small village in [[Western Scharn]], just west off the road leading south from [[Salzreich]] into [[Brenhalt]]. It sits in the middle of the hilly southern part of Western Scharn.
{{Locations}}
5ab1f0557bc6753c9073a1a1fb73aff14a86c1cb
Bacheim
0
240
392
2024-04-10T00:40:25Z
Vicht
1
Created page with "Small village in [[Western Scharn]], west off the main road south from [[Salzreich]] and into [[Brenhalt]]. Sits on the eastern edge of [[Darkwasser Wold]] near the easternmost source of the river that runs through the forest and on to [[Meeresdorf]]. {{Locations}}"
wikitext
text/x-wiki
Small village in [[Western Scharn]], west off the main road south from [[Salzreich]] and into [[Brenhalt]]. Sits on the eastern edge of [[Darkwasser Wold]] near the easternmost source of the river that runs through the forest and on to [[Meeresdorf]].
{{Locations}}
e23c9e1b53439249680908a18ff40fbc0b5b4e55
Kusen
0
241
393
2024-04-10T00:48:01Z
Vicht
1
Created page with "Small village on the westernmost coast of [[Western Scharn]], south of [[Meeresdorf]] and north of [[Wüsthafen]]. It sits slightly southwest from the two lakes that form the most westerly source of the river that flows through [[Darkwasser Wold]] and on to Meeresdorf. It can be reached from Wüsthafen by footpath. {{Locations}}"
wikitext
text/x-wiki
Small village on the westernmost coast of [[Western Scharn]], south of [[Meeresdorf]] and north of [[Wüsthafen]]. It sits slightly southwest from the two lakes that form the most westerly source of the river that flows through [[Darkwasser Wold]] and on to Meeresdorf. It can be reached from Wüsthafen by footpath.
{{Locations}}
9b04da014d0d12214d1fa4f0cb42808ed873b6a4
Löwenalt
0
242
394
2024-04-10T00:51:18Z
Vicht
1
Created page with "Town on the [[Roughspun Coast]], northeast of [[Senneborn]] and west of [[Heidestedt]] across [[Salz Bay]]. {{Locations}}"
wikitext
text/x-wiki
Town on the [[Roughspun Coast]], northeast of [[Senneborn]] and west of [[Heidestedt]] across [[Salz Bay]].
{{Locations}}
1d655c1f364bae8b26c4fadfb2b849a80720d772
395
394
2024-04-10T00:54:29Z
Vicht
1
wikitext
text/x-wiki
Northernmost town in [[Western Scharn]], on the [[Roughspun Coast]], northeast of [[Senneborn]] and west of [[Heidestedt]] across [[Salz Bay]].
{{Locations}}
09c0e8c869694832ed6c17f054499fafd04a67d8
Wurzel Drain
0
243
396
2024-04-10T00:59:51Z
Vicht
1
Created page with "A wetland in [[Western Scharn]] to the west of [[Darkwasser Wold]]. The westernmost tributary of the river that flows through the forest and on to [[Meeresdorf]] passes through <b>Wurzel Drain</b> on its way from its source towards [[Kusen]]. {{Locations}}"
wikitext
text/x-wiki
A wetland in [[Western Scharn]] to the west of [[Darkwasser Wold]]. The westernmost tributary of the river that flows through the forest and on to [[Meeresdorf]] passes through <b>Wurzel Drain</b> on its way from its source towards [[Kusen]].
{{Locations}}
1703d7df04af4858c74459fe3456b5fd63cd226a
Wüsthafen
0
244
397
2024-04-10T01:09:34Z
Vicht
1
Created page with "A town in [[Western Scharn]], on the southernmost end of its west coast, very close to the border between [[Scharn]] and [[Brenhalt]]. It is connected to [[Kusen]] to its north by a coastal footpath. [[Vichthart]] was headed to <b>Wüsthafen</b> on his bookkeeping rounds when his ship, <i class="ship">[[The Crested Eagle]]</i>, was shipwrecked by an unexpected storm off the coast of [[Meeresdorf]]. By the time Vichthart was trying to locate the [[gnoll]]s and stop them..."
wikitext
text/x-wiki
A town in [[Western Scharn]], on the southernmost end of its west coast, very close to the border between [[Scharn]] and [[Brenhalt]]. It is connected to [[Kusen]] to its north by a coastal footpath.
[[Vichthart]] was headed to <b>Wüsthafen</b> on his bookkeeping rounds when his ship, <i class="ship">[[The Crested Eagle]]</i>, was shipwrecked by an unexpected storm off the coast of [[Meeresdorf]]. By the time Vichthart was trying to locate the [[gnoll]]s and stop them from summoning [[demon]]s and storms, the Wüsthafen clergy had reported his failure to arrive to the [[Holy Quorum]], prompting [[Father Eivald Glissan]] to use [[Sending]] to check in on Vichthart.
{{Locations}}
8eaf4f57a9d7be4e6c54c3f8d6ef1a50fcc30556
Nessus
0
185
398
313
2024-04-10T01:10:30Z
Vicht
1
Added Locations navbox
wikitext
text/x-wiki
The part of the [[Nine Hells]] that [[Vastren]] is from, and to which she is supposed to have returned after being freed, per her contract with [[Mira]] and [[Grokko]]. She describes it as being much lower than the place where [[Etorn Hadaran]] will end up.
{{Locations}}
[[Category:Planes]]
cb7511c5ec1a505f97b4976906d873fb0417dc75
Asíl
0
182
399
309
2024-04-10T01:10:40Z
Vicht
1
Added Locations navbox
wikitext
text/x-wiki
[[Talyen]]'s only moon, a silvery orb. [[Ansel]] points it out on [[Suithrathus Luirmo]]'s orrery in the [[Spire of Divination]].
{{Locations}}
[[Category:Celestial bodies]]
9c22e95f037155a213d11e8e2a10a1d535e3c344
Ashtkhaan
0
183
400
311
2024-04-10T01:10:51Z
Vicht
1
Added Locations navbox
wikitext
text/x-wiki
A comet that orbits [[Talyen]]'s star. It is visible from Talyen for about a week every 600 years, and its last appearance was a [[Timeline|bit over 500 years ago]]. There are ancient legends relating to the comet going back thousands of years to the very oldest stories. [[Ansel]] points it out on [[Suithrathus Luirmo]]'s orrery in the [[Spire of Divination]].
{{Locations}}
[[Category:Celestial bodies]]
87b6b16db9d21a1dc01c936d2934ffc5119cde48
Calaha
0
188
401
317
2024-04-10T01:11:00Z
Vicht
1
Added Locations navbox
wikitext
text/x-wiki
The continent to the southeast on [[Talyen]], containing the country of [[Dhintay]]. It is south of [[Savra]] and east of [[Eaos]].
It appears on the globe in [[Ser Reginald Kobolwitz]]'s [[Kobolwitz Manor#Trophy room|trophy room]]. Ser Kobolwitz wrote of his days hunting in Calaha, including mention of [[gnoll]]s.
The [[Book of the Twinned Flame]] is the journal of a mage evaluating rumours of the [[Burning Lord]], a conquering champion weilding divine fire smiting the monsters roaming the deserts of Calaha. The unidenified author wrote of planning to visit Calaha to meet the Burning Lord, but the last pages of their journal do not mention if this occurred.
{{Locations}}
[[Category:Continents]]
1ef6bfe4e4e61b80aa493582836a30a016cd2965
Dhintay
0
181
402
307
2024-04-10T01:11:11Z
Vicht
1
Added Locations navbox
wikitext
text/x-wiki
A country in the continent of [[Calaha]]. Its ruling party is called the [[Conflagracy]].
While they are waiting in the [[Valiant Morgen warehouse]], [[Grokko]] beats [[Mira]] at a dice game, so Mira tells Grokko that he is from <b>Dhintay</b>.
During the 3 days after the [[bone devil]] is killed, Mira asks [[Orianna]] if she recognizes the twinned flame symbol on his [[Book of the Twinned Flame]], and she thinks she recalls seeing it on a seal on a letter, or other piece of paper, belonging to her brother [[Arnunna]]. Mira asks if she's heard of Dhintay, and she recalls it as being a country in the east, but she's not familiar with the [[Conflagracy]] because she doesn't pay much attention to the politics of other places. Mira says the symbol belongs to the assassins of the Conflagracy, prompting Orianna to quip, ‘Ah, political shit.’
{{Locations}}
[[Category:Countries]]
c13764d9de0761b7d779b342356c0adc47724397
Eaos
0
186
403
315
2024-04-10T01:11:21Z
Vicht
1
Added Locations navbox
wikitext
text/x-wiki
The continent to the southwest on [[Talyen]]. It is south of [[Elengon]] and west of [[Calaha]]. It appears on the globe in [[Ser Reginald Kobolwitz]]'s [[Kobolwitz Manor#Trophy room|trophy room]].
{{Locations}}
[[Category:Continents]]
eaa19014f83979585b0f012c1922ed3d2cd6586c
Savra
0
187
404
316
2024-04-10T01:11:30Z
Vicht
1
Added Locations navbox
wikitext
text/x-wiki
The continent to the northeast on [[Talyen]]. It is north of [[Calaha]] and east of [[Elengon]]. It appears on the globe in [[Ser Reginald Kobolwitz]]'s [[Kobolwitz Manor#Trophy room|trophy room]].
{{Locations}}
[[Category:Continents]]
a25905153343c8c72a158ab6a98849d26366b258
Spanish
0
189
405
318
2024-04-10T01:11:39Z
Vicht
1
Added Locations navbox
wikitext
text/x-wiki
When [[Suithrathus Luirmo]] mentions that [[Elgrex Anderra]] was another [[dragonborn]] Master of the [[Acropolis of Kereskaa]], [[Anrel]] clarifies that ‘Elgrex’ was her first name, and not <b>Spanish</b>. When asked what this word means, he claims it is a land far to the south, at least according to a fantasy novel that he'd read. [[Vichthart]] is unimpressed, stating that as a priest he is only concerned with the truth. For some reason, this makes [[Anrel]] laugh.
{{Locations}}
dd68fda152a14d8882223fb510465aeb83665e55
Talyen
0
184
406
312
2024-04-10T01:12:18Z
Vicht
1
Added Locations navbox
wikitext
text/x-wiki
One of three planets in its solar system, as depicted on [[Suithrathus Luirmo]]'s orrery in the [[Spire of Divination]]. [[Anrel]] doesn't know the names of the other two planets.
The planet has four continents:
; Elengon
{{Main|Elengon}}
: The continent to the northwest, containing the [[Arkhellen Empire]], [[Fuarcrùn Freeholds]] and other nearby lands.
; Eaos
{{Main|Eaos}}
: The continent to the southwest
; Savra
{{Main|Savra}}
: The continent to the northeast
; Calaha
{{Main|Calaha}}
: The continent to the southeast, containing [[Dhintay]]
The globe in [[Ser Reginald Kobolwitz]]'s [[Kobolwitz Manor#Trophy room|trophy room]] shows all four of these continents. The orrery in the Spire of Divination shows continents that Anrel is not familiar with.
{{Locations}}
[[Category:Celestial bodies]]
21018f57d608cbc5d50e1264ec1d20ef78a88d9e
Kythera
0
208
407
347
2024-04-10T01:12:34Z
Vicht
1
Added Locations navbox
wikitext
text/x-wiki
A flying city of mages, capable of moving across the land and launching arcane attacks on anything below. Its people, along with [[Teklanna Morantine]], were responsible for the attack on the [[Acropolis of Kereskaa]].
When defending Kaarst's ban on magic to [[Grokko]], [[Sable Warden Meriele Berevan]] described a city larger than [[Kaarst]] floating through the air on a rock larger than any mountain, it being armed with all manner of arcane ability to scorch the earth. Later, [[Suithrathus Luirmo]] describes <b>Kythera</b> as a flying city of mages, constructed with arcane power. [[Vichthart]] has heard of flying cities, of which there were several being used as weapons of mass destruction in the great wars. Though none are known to remain, there are occasional search parties for them.
Suithrathus visited Kythera where he saw something that impressed him and inspired him to construct his orrery in the [[Spire of Divination]]. He explains that they grew from being persuers of knowledge to persuers of power, and that he later came to realise that the <b>Kytherans</b> had developed a desire to acquire something that the [[Acropolis of Kereskaa]] was protecting, possibly the [[Dragon Orb of Drimysthonantas]]. It was while Suithrathus was using his divining mirror to contemplate this problem that the Kytherans attacked the Acropolis.
{{Locations}}
e1bbb37212def327e18a8de4a51e2a1bce8d4cff
Leurisan
0
180
408
306
2024-04-10T01:12:55Z
Vicht
1
Added Locations navbox
wikitext
text/x-wiki
A country in the southeast of [[Elengon]], far away from the [[Arkhellen Empire]] on the far side of the [[Sundering Sea]]. The country of [[Rossaña]] recently went through a civil war, which resulted in a portion of the territory splitting into its own independent nation, <b>Leurisan</b>.
[[Orianna]] and [[Arnuanna]] were raised together in Leurisan before they moved to the Arkhellen Empire. When Orianna learns about Arnuanna's secret master, she paces the room muttering curses in Leurisan, which nobody else understood.
{{Locations}}
[[Category:Countries]]
bf79085b1af1f0d1dfe6b1516a4d261c61b7d7fd
Rossaña
0
179
409
308
2024-04-10T01:13:04Z
Vicht
1
Added Locations navbox
wikitext
text/x-wiki
A country in the southeast of [[Elengon]], far away from the [[Arkhellen Empire]] on the far side of the [[Sundering Sea]]. It has recently been through a civil war, which has resulted in a portion of the territory splitting into its own independent nation, [[Leurisan]].
It has at some point been visited by [[Ser Reginald Kobolwitz]], who brought back a suit of armour in its style, with plumage and golden embellishments, to be placed in [[Kobolwitz Manor]].
{{Locations}}
[[Category:Countries]]
249f99077d773deed3604e272964e9aa3af64b44
Bergstraßer
0
21
410
33
2024-04-10T01:13:19Z
Vicht
1
Added Locations navbox
wikitext
text/x-wiki
Mining town in [[Denkrei]]. Has a church of [[Sarenrae]]. The [[Iron Fang]] is here, and [[The Piß Keepers]] perform in taverns here.
[[File:Bergstrasser, Denkrei.png|thumb|center|upright=2|Map of Bergstraßer]]
{{Locations}}
[[Category:Settlements]]
f9564632922b10a213da1c238d2c867bfbfe43cb
Sarenrae
0
44
411
51
2024-04-10T14:45:26Z
Vicht
1
Added Basilica Endeavorant and Characters template
wikitext
text/x-wiki
The <b>Dawn Flower</b>, goddess of Temperance, Patience, Compassion and Peace. One of the twelve gods of [[Verein Kirche von Arkhelle]]. She is a younger god of redeeming light and vengeful flame, whom neither [[Suithrathus Luirmo]] nor [[Vastren]] has heard of. Born during the [[Second Intervention]], Sarenrae teaches that those who can be redeemed should be guided on the path to salvation—and those who cannot repent their evil should be destroyed without remorse. She is depicted as a beautiful young [[human]] woman of bronze skin, with long golden braided hair that crackles with flame and angelic wings of iridescent gold. Her colours are golden yellow, fuschia and azure, and her symbols are a winged ankh, dove or phoenix of warm gold or fiery red. The seat of her church is the [[Basilica Endeavorant]] in [[Hellenhelm]].
[[Vichthart]] is a priest of Sarenrae, usually preaching and guiding his parishioners in his small home village in [[Arkhelle]]. He wears a pendant of Sarenrae around his neck, along with his [[Periapt of Wound Closure]], which he grasps and holds aloft whenever he invokes his god's power to dispell and destroy undead beings. He has known it to grow warm at times when Sarenrae has spoken to him. These times have been sparse: once, when he first entered the water from the sinking ship <i class="ship">[[The Crested Eagle]]</i>, compelling him to swim, and again when a voice in his ear persuaded him to unite the [[Feywild Shard]] with [[Grokko]]. Another survivor of <i class="ship">The Crested Eagle</i> to heed the call of Sarenrae was its former first mate, [[Lania Falst]], who began wearing her own pendant of Sarenrae in gratitude for surviving the shipwreck.
Vichthart's father, [[Decheimül Fezzilbahn]], is also a priest of Sarenrae, and was known to [[Cardinal Maurul Silkendawn]] by his reputation. [[Elias]] is a cleric of Sarenrae. A symbol of Sarenrae was discovered in the sewers of [[Senneborn]] after the party defeated the transparent [[gelatinous cube]].
{{Characters}}
[[Category:Gods of Verein Kirche von Arkhelle]]
[[Category:Humans]]
35d9b1391890e1c6ae1db62c2a40854d78dc148a
Seebo Clattercast
0
13
412
15
2024-04-10T14:49:41Z
Vicht
1
Added Characters navbox and Category: Gnomes
wikitext
text/x-wiki
[[Gnome]] member of [[The Piß Keepers]], gets kidnapped because of his gambling debts.
{{Characters}}
[[Category:Gnomes]]
[[Category:Members of The Piß Keepers]]
bf79ae43a1adc94c5062bb331e1c7b94bc4f0ef4
Kenneth
0
28
413
302
2024-04-10T14:51:00Z
Vicht
1
Added Characters navbox and Category: Humans
wikitext
text/x-wiki
<dfn><b>Kenneth Smit</b></dfn> is an [[Artificer]] specializing in Artillerism who joins [[Grokko]] and [[Vichthart]] when their ship, <i class="ship">The Crested Eagle</i>, sank in a mysterious storm off the coast near [[Meeresdorf]]. Known for his use of the [[Magic Stone]] cantrip, for which Grokko calls him <b>Stone Boy</b>. Builds a pair of [[Goggles of Night|goggles that bestow night vision]] that he shares with Vichthart until his departure, and begins making [[eldritch cannon]]s that can function as a flamethrower. Kenneth goes triggerhappy when he first uses his flamethrower, cutting down smugglers as they try to flee.
Kenneth used to fight alongside [[Kerstin Pletscher]] near the [[Sternwall]], [[Bükerstadt]], but hails originally from somewhere not far south of [[Hellenhelm]]. His friend [[Nikola]] has not been found since Bükerstadt was occupied by [[orc]]s. According to a rumour heard by Vichthart on <i class="ship">The Crested Eagle</i>, Kenneth once made a small fortune in the south running a trade caravan.
Kenneth began staying behind to protect others starting in [[Droghen’s keep]], when he stays in the dungeon to protect its human prisoners. He then stays in Meeresdorf while Grokko, [[Kham]] and Vicht find <i class="Dancing in the Storm">Dancing in the Storm</i> to keep the village protected in case [[Droghen]] decides to attack it. After that, he again stays with the [[Zaheer island|island's]] slaves instead of going to confront [[Srir]]. He elects to leave the party permanently once Srir is defeated, taking his Goggles of the Night with him.
{{Characters}}
[[Category:Characters played by Neal]]
[[Category:Artificers]]
[[Category:Members of the Iron Tempest Mercenary Company]]
[[Category:Humans]]
a8bb3daf01c03a0838334b547564f0f8e72afae1
Mira
0
39
414
52
2024-04-10T14:51:12Z
Vicht
1
Added Characters navbox and Category: Tieflings
wikitext
text/x-wiki
<dfn><b>Mirark</b></dfn> is a [[tiefling]] [[warlock]] who joined [[Grokko]], [[Kham]] and [[Vichthart]] in investigating the deaths and disappearances of multiple people in [[Kaarst]]. He is 1.70 m tall, with white skin, purple hair and yellow eyes, and usually goes by the shorter name <b>Mira</b>. He has the traditional horns and classic devilish tail of a tiefling, although he keeps these hidden under his robes. His new friends often jokingly refer to him as a catboy, despite not actually having any feline features. When Vichthart first met Mira, being slightly tipsy and having recently fought demons on [[Zaheer island|an island]], he asked his friends why there was a demon with them.
Mira comes from the far away country of [[Dhintay]], although only Grokko has been told its name. Nearly one decade ago he lost someone important to him, another tiefling who was taken from their home against their will. After receiving a tip to find ‘[[The Tide]]’, he travelled to Kaarst where he was ambushed by a gang of seven [[human]]s who tried to fleece him for his money and valuables. They were easily scared away or knocked unconscious by his powerful arcane magic, but it attracted the attention of Grokko and Kham, who warned him not to let his magic be known publicly in this city. They took him back with them to [[The Copper Roost]] to meet Vichthart, and after learning that they were all looking for missing persons, decided to work together.
Mira's magical powers are granted by his patron, [[Etaf]], a being who is bound to the inside of a gold ring that Mira wears, and can occasionally retreat inside. Etaf wants him to find who imprisoned him in the ring so he can be free, and has advised him to begin by finding out more about the people Mira took the ring from. He has also pointed out to Mira that his new friends do not yet trust him, and he would be wise to do more to win them over. Immediately after this, Mira spent the day trying to be as close and kind to Kham as possible, who he perceived as the most hostile of his new accomplices, all to Kham's infuriation. As well as somehow entering the ring, Mira has also shown the abilities to black out a large area, levitate, to teleport himself and another a short distance, and to fire [[eldritch blast]]s.
Mira also has an extraordinary ability to move about undetected, which the party has encouraged him to do at certain times, but he has also tended to do this while separating from them unannounced, resulting in their confusion and frustration. He also has a habit of taking anything he can for himself, including items from [[Kobolwitz Manor]], a crime scene they were investigating under official instructions. Sometimes these behaviours have backfired, as Mira has been attacked by a [[mimic]] and been injured by trapped mechanisms, as well as received significant criticism from his companions. When he asked if he could take items from [[Irann Rhogar]]'s [[Irann Rhogar's house|house]], however, [[Sable Warden Meriele Berevan]] remarked with the slightest of grins that it would be appropriate to use [[candlestick|his wealth]] to try to stop him. He has also successfully detected a hidden passageway underneath [[Squall's Beacon]], hurried the party unseen through the back alleys of Kaarst, and distracted [[devil]] guards by talking to them in their native infernal language.
[[Vastren]] showed interest in Mira, noticing that his bloodline was not like that of the [[human]]s and [[elf|elves]] she'd met. She called him a liar when he gave his name as ‘Mirark’, only believing him when he gave his name as ‘<b>Arkmir</b>’. Only Vichthart overheard this, and has not mentioned it to anyone. Conversely, only Mira was with Kham when he met and talked with [[Elira Lein]], who called him ‘Anrel’ and was surprised to realize he'd been using the pseudonym ‘Kham’, the name of a [[Real Kham|mutual acquaintance]]. He has promised Kham not to mention any part of the conversation to anyone else.
Mira's body was recently changed to present as female by a mirror contraption created by [[Toross Rhistel]], Master of [[Transmutation]] at the [[Acropolis of Kereskaa]], in the catacomb beneath the [[Spire of Transmutation]]. His body was also shrunken to the size of a halfling, although this reverted on its own. His body has remained female throughout his fight against the [[bone devil]].
{{Characters}}
[[Category:Characters played by Erik]]
[[Category:Warlocks]]
[[Category:Tieflings]]
567caca18d386db3a464579817e65ffd000c7d9a
Vichthart
0
2
415
10
2024-04-10T14:51:28Z
Vicht
1
Added Characters navbox and Category: Humans
wikitext
text/x-wiki
<b><dfn>Father Vichthart Fezzilbahn</dfn></b>, affectionately called <b>Priestman</b> by [[Grokko]], is a member of clergy within [[Verein Kirche von Arkhelle]] and a priest of the goddess of redemption, [[Sarenrae]]. He is a relatively quiet and reserved man, tending to let actions occur around him, but years of travel, as well as recent events, have kept him a stalwart defender when travelling alone or with others. Although he isn't a confident conversationalist, he is a fastidious keeper of notes that he keeps to present to his highers up within the church, and given time he can prepare a competent speech and deliver it with enthusiasm.
Normally Vichthart, or just Vicht, lives at home with his wife—[[Anastel]]—and their three children in a quaint village where he is the local priest, delivering sermons and supporting the spiritual and personal lives of his parishioners. However, he annually travels around the western end of the [[Roughspun Coast]] in order to audit the records of tithes collected by churches in that area. He has grown familiar with the priests along his route, including [[Father Traulam Eugen]] in [[Senneborn]], and he enjoys meeting other individuals on his annual trip. Years of solo travel have accustomed him to tackling the occasional thug, [[goblin]] or wild animal on the road.
On his most recent trip to [[Scharn]], Vichthart was travelling on <i class="ship">[[The Crested Eagle]]</i> when it sank off the coast near [[Meeresdorf]]. A word from Sarenrare though helped him to survive and swim to shore along with Grokko, [[Kenneth]] and the unconscious [[Lania Falst]]. Learning from the harbourmaster [[Solomon Dugraf]] that all ships off this coast have mysteriously sunk in inexplicable storms, Vicht and his companions are thrust into the responsibility of defending [[Western Scharn]] from an incursion of [[demon]]-worshipping [[gnoll]]s led by [[Srir Silthallow]] and [[Rrekkeh Stormcrawler]]. After closing their portal on a small, forgotten island, instead of being able to continue his regular duties or return home, Vichthart was summoned to [[Kaarst]] to provide outside assistance in the investigation of a string of murders and disappearances. Taking Grokko and [[Kham]] with him, and teaming up with newcomer to the empire [[Mira]], they uncovered and disrupted a conspiracy of mages plotting with [[devil]]s and [[vampire]]s to detonate heavy explosives underneath the city.
Vichthart is originally from [[Heldruh]], just north of the imperial capital [[Hellenhelm]], but studied to become a priest in [[Baumeln]], a town on the border of [[Arkhelle]], Scharn and [[Denkrei]]. He stays overnight in Kaarst every year at the start of his rounds, staying at [[The Copper Roost]], although he doesn't enjoy the noise and bustle of cities, nor the idiosyncratic laws and clergy of Kaarst. Nevertheless, while he waits for his friends to find him in the city, he manages to drink enough to become slightly merry. He has only occasionally reached the limits of his patience, being incensed at the theft of the [[platinum gauntlet]] holy relic from the [[Church of St Anorad]], and throwing one gnoll off a bridge in a rage after first encountering the demons they'd summoned.
Vichthart is loyal to Verein Kirche von Arkhelle, reporting to [[Father Eivald Glissan]] at <abbr title="Holy Quorum">[[HQ]]</abbr> regularly, keeping extensive notes to hand in to Hellenhelm, and being excited to meet [[Cardinal Maurul Silkendawn]]. Although he has listened patiently to [[Reiner Hoss]] outline his hatred of [[Kade Sirrine Kathedrale]] for its treatment of those who worship [[Mystra]], he remains steadfast in his resolve to protect the church, placing his trust in [[Sable Warden Meriele Berevan]] and her hatred of the undead to confide their findings to her, despite their suspicion that there might be insiders within the clergy. He tells Kham that there are no grounds for him to assassinate Cardinal Silkendawn, no matter what cooperation it gets them from [[Leagallow Tiaathque]] in the short term.
Vichthart is also devoted to his goddess, Sarenrae, praying to her every morning. He has very occasionally received words of advice from her via his holy pendant, being told to swim when first falling in the cold waters off Meeresdorf, and recently being guided to put the [[Feywild Shard]] in the hands of Grokko. He was pleased to see Lania Falst wearing a pendant similar to his own after she recovered in Meeresdorf, and has been keenly watching Grokko's growing interest in the church, disappointed by how readily he's changed his attitude after speaking to members of the [[Knives of Mystra]]. Early on in his adventures in Scharn, he experienced a dream of his father, [[Father Decheimül Fezzilbahn]], in the form of an early lesson he received about the duality of Sarenrae, and the very real fight against evil being just as important as the protection and redemption of good people.
Vichthart's eagerness to serve the church, to purge the world of fiendish invaders, and protect his friends, can sometimes cause him to fight with reckless regard for his own well being. His use of his shield and mace, and tendency to try to grapple and pin his opponents, result in his ending up close to danger multiple times. When first attacking a goblin hideout near Meeresdorf, Vichthart neared death at the hands of the [[bugbear]] [[Tark]], receiving a permanent, sun-shaped scar on his chest. His acquisition of [[platinum ring]]s from [[faerie dragon]]s has encouraged him to take even more damage by regularly casting [[Warding Bond]] on Grokko. Fortunately, his discovery and wearing of the [[Periapt of Wound Closure]] has saved his life on every occasion, but falling unconscious so often has frequently left him unable to fight, to flee dangerous situations, or heal his friends when needed. While facing the Knives of Mystra underneath Kaarst, he needed to be administered a [[Potion of Healing]] twice by the [[Raven Guard]] nicknamed [[Black]].
Vichthart has twice been infected by disease, firstly taking a swipe from a gnoll that gave him an uncanny cackle, and later breathing in fungal spores from a [[false beholder]] beneath [[Squall's Beacon]]. In both cases, Vichthart brushed aside concerns for his wellbeing, and although his cackling subsided on its own, it was only when Kham used his [[Lay On Hands]] that Vichthart coughed up the horrible clump that had been growing inside him that they realized how perilous his infection had been.
{{Characters}}
[[Category:Heroes]]
[[Category:Humans]]
[[Category:Clerics]]
[[Category:Members of Verein Kirche von Arkhelle]]
[[Category:Worshippers of Sarenrae]]
[[Category:Fezzilbahn family]]
[[Category:Characters played by Wil]]
51a750dd02032e0ba24e6908ba434499492856e3
Spotter
0
220
416
367
2024-04-10T14:51:59Z
Vicht
1
Added Characters navbox
wikitext
text/x-wiki
[[Kenku]] who works under [[Detlef]] in [[Senneborn]]. Possibly the one who keeps control of the lever and the bars from their stool at the end of a long corridor.
{{Characters}}
[[Category:Criminals working for Droghen]]
[[Category:Kenku]]
7d31631666bb84068e29a5d121aa4f7b5a3007e4
Elias
0
8
417
8
2024-04-10T14:52:23Z
Vicht
1
Added Characters navbox and Category: Kenku
wikitext
text/x-wiki
[[Kenku]] [[cleric]] of [[Sarenrae]] and member of [[The Piß Keepers]]. Played by [[Traggey]].
{{Characters}}
[[Category:Clerics]]
[[Category:Kenku]]
[[Category:Worshippers of Sarenrae]]
[[Category:Members of The Piß Keepers]]
[[Category:Characters played by Traggey]]
5f446ab8f6f0210993a1422cf287ae3629a2b8e3
Grezz
0
9
418
12
2024-04-10T14:52:58Z
Vicht
1
Added Characters navbox and Category: Kobolds
wikitext
text/x-wiki
[[Kobold]] member of [[The Piß Keepers]], albeit difficult to determine if he qualifies more as a pet. Played by [[Wil]].
{{Characters}}
[[Category:Members of The Piß Keepers]]
[[Category:Characters played by Wil]]
[[Category:Kobolds]]
c6192f944c70ab04983692402674622e4fe6564d
Cora Hothead
0
10
419
11
2024-04-10T14:53:15Z
Vicht
1
Added Characters navbox
wikitext
text/x-wiki
Surprisingly patient (or maybe just fatigued) mother figure of [[The Piß Keepers]]. Played by [[Manco]].
{{Characters}}
[[Category:Members of The Piß Keepers]]
[[Category:Characters played by Manco]]
5eb8296aa0d0580b0b98e472e3c3fdcece38c4d7
Slabbledab
0
11
420
301
2024-04-10T14:53:30Z
Vicht
1
Added Characters navbox and Category: Goblins
wikitext
text/x-wiki
[[Goblin]] member of [[The Piß Keepers]]. Played by [[Neal]].
{{Characters}}
[[Category:Members of The Piß Keepers]]
[[Category:Characters played by Kevin]]
[[Category:Goblins]]
0dd24025f613e867211a4ad48765a33770bb164b
Arnt
0
210
421
349
2024-04-10T14:53:39Z
Vicht
1
Added Characters navbox
wikitext
text/x-wiki
14- or 15-year-old child criminal who works with [[Detlef]]. She discovered him on the streets of [[Kaarst]] 3 years ago. Had a poor experience being raised in religious care homes and so refuses to go back to one, so the party instead recommends he finds work or apprenticeship in [[Senneborn]]. Leads the party to a hidden room behind the prison.
{{Characters}}
[[File:Arnt.png|thumb|center|upright=0.8|Arnt]]
[[Category:Criminals working for Droghen]]
177d6bc2ee4f465660775ff5aac05d31b5403134
Bertrand
0
211
422
353
2024-04-10T14:53:47Z
Vicht
1
Added Characters navbox and Category: Humans
wikitext
text/x-wiki
Smuggler in the basement of the suspicious [[Senneborn warehouse|warehouse]] of [[Senneborn]], who the party keeps alive and interrogates. He lets them know about the secret entrance to the [[Ratway]] behind the fireplace, but doesn’t know how to open it.
{{Characters}}
[[Category:Criminals working for Droghen]]
7f984525aa97e30b01dc1b5afbce4a0e8af64ec5
Bezur
0
212
423
351
2024-04-10T14:53:57Z
Vicht
1
Added Characters navbox
wikitext
text/x-wiki
[[Droghen]] threatens [[Tark]] by saying if he messes up, he’ll be replaced by <b>Bezur</b>.
{{Characters}}
[[Category:Criminals working for Droghen]]
3c4d823a0d7b8c18235f70a5ebd9405832e402db
Bill
0
213
424
352
2024-04-10T14:54:02Z
Vicht
1
Added Characters navbox
wikitext
text/x-wiki
Entrance guard at the suspicious [[Senneborn warehouse|warehouse]] in [[Senneborn]]. [[Vichthart]] and [[Grokko]] try to distract him by soliciting donations to [[Verein Kirche von Arkhelle]] on top of their regular tithes.
{{Characters}}
[[Category:Criminals working for Droghen]]
89c7d0b6964bea32bc15b7d8a9840758c28e4189
Davin
0
214
425
354
2024-04-10T14:54:08Z
Vicht
1
Added Characters navbox
wikitext
text/x-wiki
Smuggler working under [[Detlef]], who stole a necklace and snuck about in restricted places without being caught. Their friend [[Hilta]] urged them to stop misbehaving for their own safety, but they were caught stashing gold elsewhere and were killed for it.
{{Characters}}
[[Category:Criminals working for Droghen]]
eec4f46c49dadbfad0c19638bd4ee4af637572be
Armine Detlef
0
225
426
374
2024-04-10T14:54:13Z
Vicht
1
Added Characters navbox
wikitext
text/x-wiki
Criminal leader in [[Senneborn]], works under [[Droghen]] but very high ranking. Wears splint armour, wields a heavy crossbow and has very confident body language. She wants more pay from Droghen because she understands (or thinks she does) the limits of what can be stolen without attracting too much unwanted attention.
She left a note about [[Davin]]'s theft and death, which [[Grokko]] found when taking 2 [[bottles of ale]]. After [[Anrel]] is freed from the [[Ratway]] and finds her, <b>Detlef</b> offers him a job, which he declines. They defeat her on [[Calendar|10th Thirkuoss]] when Anrel cuts her arm off and she admits defeat, and is taken by [[Kerstin Pletcher]] back to the [[Iron Temple Mercenary Company]].
Looked after [[Arnt]] for 3 years after discovering him on the streets of [[Kaarst]].
In the days after the party killed the [[bone devil]] beneath Kaart, [[Grokko]] realized he had acquired [[Detlef's journal]].
{{Characters}}
[[Category:Criminals working for Droghen]]
[[Category:People who have lost an arm to Anrel]]
ef9e17c63b5463c70f6561495fb53cdcd4cbb6eb
Droghen
0
238
427
388
2024-04-10T14:54:23Z
Vicht
1
Added Characters navbox
wikitext
text/x-wiki
Leader of an organized crime network in [[Western Scharn]] (at least), with many [[goblin]], [[hobgoblin]] and [[bugbear]] underlings, but also highly trusted [[human]] and [[half-elf]] members like [[Detlef]] and [[Vantan]].
When the party infiltrates his [[Droghen's keep|keep]], they are overwhelmed by his forces but are allowed to leave after hearing and accepting his proposal to them. In return for their lives, he gave them the option of locating and killing the gnoll [[Srir Silthallow]], saying that she had arrived in his territory and made a deal with him. This deal involved Srir's [[gnoll]] pack being given a certain freedom as well as protection by Droghen's forces, and in return they would use their abilities to sink ships off the coast near [[Meeresdorf]] for Droghen's underlings to capture the shipwrecked crew and cargo.
[[File:Droghen.png|thumb|center|upright=0.65|Droghen]]
<b>Droghen</b> understood that Srir's powers came from the worshipping and summoning of [[demon]]s, and he wanted to have this power for himself. If the party killed Srir, it would leave Droghen free to acquire that power for himself. Since [[Anrel]] and [[Vichthart]] were entirely aware of the dangers of demons being brought to the [[material plane]], the party agreed to Droghen's terms so they could eliminate the threat. Droghen told them that due to a separate arrangement he'd made, he was unable to tell the party how to locate Srir. Instead, he could only advise them to speak to [[Jenora Greenheart]] in [[Aleph Marsh]].
As insurance, Droghen threatened to destroy Meeresdorf if they didn't uphold their end of the bargain, or if they told the people of Meeresdorf of the threat Droghen had made against them. While Anrel, [[Grokko]] and Vichthart made their way to Aleph Marsh, [[Kenneth]] stayed in Meeresdorf to protect the people there in case Droghen ever attacked.
So that Droghen's forces across Western Scharn wouldn't attack the party, he gave them a [[Symbol of Bane]] to present, which his underlings would be informed remotely meant they should cooperate with the party bearting it. He also tells the party that they are to refrain from killing any more goblins.
When the party kills Srir and [[Rrekkeh Stormcrawler]] flees, [[Szegha Silthallow]] reassures the party that Droghen will not be able to acquire their power to summon and control demons. The party takes her word for it and does not ever return to Droghen.
{{Characters}}
[[Category:Hobgoblins]]
974c180201ec4f4c985f803d2f0261e39f3f1a82
Falk
0
215
428
355
2024-04-10T14:54:32Z
Vicht
1
Added Characters navbox
wikitext
text/x-wiki
Smuggler in the sewers beneath [[Senneborn]] who struggled to keep the door to the [[Ratway]] shut. Doesn’t trust [[Arnt]].
{{Characters}}
[[Category:Criminals working for Droghen]]
7907f908df65edbdc79c542100f59cd6741ad58e
Hilta
0
216
429
356
2024-04-10T14:54:36Z
Vicht
1
Added Characters navbox
wikitext
text/x-wiki
Smuggler working under [[Detlef]]. Knows that [[Davin]] is skimming off the top and warns him to stop before Detlef finds out. They're unsuccessful, and Davin is caught and killed.
{{Characters}}
[[Category:Criminals working for Droghen]]
cef184a75c55a48d33a7444d828e4d5e3ec9f889
Jochim
0
217
430
357
2024-04-10T14:54:40Z
Vicht
1
Added Characters navbox
wikitext
text/x-wiki
Smuggler decently respected by [[Detlef]], especially for his dealings with [[Droghen]]. Attacks the party with 3 crossbowers as they approach [[Senneborn]], thus drawing their attention to the [[bandit camp]] outside town.
{{Characters}}
[[Category:Criminals working for Droghen]]
2341b120ad5fe68b20204a92d7a654dbdb4823bd
Knuth
0
218
431
365
2024-04-10T14:54:43Z
Vicht
1
Added Characters navbox
wikitext
text/x-wiki
[[Hobgoblin]] jailer of [[Droghen's keep]]. The party was forewarned about how cruel he was, and his chamber contained many tools of torture. Unusually, as he was being killed, he seemed to enjoy the experience of pain. The ‘K‘ in his name is not silent.
{{Characters}}
[[Category:Criminals working for Droghen]]
[[Category:Hobgoblins]]
04cbc9617cfaacada2653ea5c1007887bdb957a4
Ogak
0
219
432
366
2024-04-10T14:54:48Z
Vicht
1
Added Characters navbox
wikitext
text/x-wiki
[[Hobgoblin]] in the [[gnoll encampment]] who is somehow expecting the party's arrival. He is the leader of Droghen's forces in the camp, and the other [[goblin]]s and hobgoblins don't attack the party even without them having to show their [[symbol of Bane]]. <b>Ogak</b> describes the layout and situation to the party. Later his head is seen worn on a [[gnoll]]'s belt.
{{Characters}}
[[Category:Criminals working for Droghen]]
[[Category:Hobgoblins]]
2cdadbb29ec38444e8100606be67a25d8860508b
Swiper
0
221
433
368
2024-04-10T14:54:52Z
Vicht
1
Added Characters navbox
wikitext
text/x-wiki
[[Kenku]] who works under [[Detlef]] in [[Senneborn]]. Possibly the one who pickpockets on the streets.
{{Characters}}
[[Category:Criminals working for Droghen]]
[[Category:Kenku]]
c0cc251c3f79c1777f35948bf8b4f20ebf9a6363
Talxa
0
223
434
369
2024-04-10T14:54:56Z
Vicht
1
Added Characters navbox
wikitext
text/x-wiki
[[Goblin]] priestess who hides in [[Droghen's keep]], worshipping a [[:Category:Gods|god]] forbidden amongst the underlings of [[Droghen]], who are forced to worship [[Bane]] alone. She requested that the party killed [[Droghen]].
{{Characters}}
[[Category:Criminals working for Droghen]]
[[Category:Goblins]]
4685a9dc8c2eabcec2c47bbc7cd108404d764fec
Tark
0
3
435
364
2024-04-10T14:55:00Z
Vicht
1
Added Characters navbox
wikitext
text/x-wiki
[[Bugbear]] running the cargo collection hideout near [[Meeresdorf]], whose attack with a mace knocks [[Vichthart]] unconscious and leaves a permanent sun-shaped scar on his chest. He is swiftly killed by [[Grokko]] and [[Kenneth]]. [[Droghen]] had written to <b>Tark</b> directly, threatening to replace him with [[Bezur]] if he messed up.
{{Characters}}
[[Category:Bugbears]]
[[Category:Criminals working for Droghen]]
67a7ee666e855df05867b50326ac8daac0a8bcf2
Vantan
0
224
436
378
2024-04-10T14:55:05Z
Vicht
1
Added Characters navbox
wikitext
text/x-wiki
[[Half-elf]] spellcaster who works for [[Droghen]] and [[Detlef]]. He can move about very fast, either due to magic or hidden passages. When confronting the party, he actually does not attack them but [[Anrel]] gives him a bloody nose.
When the party finds an [[Kobolwitz Manor Tide note|instruction note]] signed by <b>V</b> in the secret basement of [[Kobolwitz Manor]], [[Vichthart]] wonders if it was written by <b>Vantan</b>. However, it turns out to be a pseudonym of [[Orianna]]'s.
{{Characters}}
[[Category:Criminals working for Droghen]]
[[Category:Half-elves]]
2c743d949b682cd2e8a1368b440801d12b03d487
Henry Hungleberry
0
192
437
321
2024-04-10T14:55:08Z
Vicht
1
Added Characters navbox
wikitext
text/x-wiki
When [[Mira]] asks [[Suithrathus Luirmo]] about a door in the [[Acropolis of Kereskaa#Grand Library|Grand Library]] that very obviously leads back out to the corridor they'd just entered from, [[Anrel]] jokes that the ancient door was actually crafted by this individual.
{{Characters}}
0f9a1af66e32ae05833b2cdc347b3171e5545899
Achima
0
196
438
327
2024-04-10T14:55:12Z
Vicht
1
Added Characters navbox
wikitext
text/x-wiki
A thug in [[Kaarst]] working under [[Ertus]]. Ertus instructs them to search [[Mira]]'s robes. Unknown if they escaped or were knocked unconscious in the alley.
{{Characters}}
2ad89612c70e5ce42300e4df3603f5b2103e7dec
Bogdan
0
197
439
328
2024-04-10T14:55:16Z
Vicht
1
Added Characters navbox
wikitext
text/x-wiki
Brother of [[Bogdin]] and thug in [[Kaarst]] working under [[Ertus]]. Initially tried to flee from the alley after [[Mira]] cast [[Hunger of Hadar]] but was tripped up by [[Anrel]]'s whip.
{{Characters}}
80a0d7a2a6b16a86abf49e39f6325964ca8a6f10
Bogdin
0
198
440
329
2024-04-10T14:55:19Z
Vicht
1
Added Characters navbox
wikitext
text/x-wiki
Brother of [[Bogdan]] and thug in [[Kaarst]] working under [[Ertus]]. While inside the inky blackness of [[Hunger of Hadar]], he accidentally slashes at one of his fellow thugs. He is the last thug left in the alley with Ertus, and manages to escape along with him. Claimed his name was Bogdan while Bogdan was visibly lying on the floor.
{{Characters}}
3a619c9fda7541f57f03c98e052735d59cbe4a4d
Iron Fang
0
17
441
19
2024-04-10T14:55:25Z
Vicht
1
Added Characters navbox
wikitext
text/x-wiki
Found in [[Bergstraßer]], [[Denkrei]].
{{Characters}}
2fa2bcb2415261a5266d0708784806c790875d4c
Doug Zenner
0
18
442
20
2024-04-10T14:55:28Z
Vicht
1
Added Characters navbox
wikitext
text/x-wiki
A miner in [[Bergstraßer]] who goes missing.
{{Characters}}
ce37574c087af70bf798a877227d28aac60fab8e
Avandra
0
30
443
46
2024-04-10T14:55:32Z
Vicht
1
Added Characters navbox
wikitext
text/x-wiki
The <b>Lady Grace</b>, goddess of Luck of Fortune. One of the twelve gods of [[Verein Kirche von Arkhelle]]. Depicted as a [[halfling]] with a carefree smile, running through a cornfield of gold, copper and yellow. Their symbol is worn by the acting priestess of [[Church of St Anorad]] in [[Senneborn]] after its regular priest—[[Father Traulam Eugen]]—is summoned to [[Kaarst]].
{{Characters}}
[[Category:Gods of Verein Kirche von Arkhelle]]
[[Category:Halflings]]
3baab771ea93323d26a3a6930ce4e3536854de6b
Bahamut
0
31
444
35
2024-04-10T14:55:39Z
Vicht
1
Added Characters navbox
wikitext
text/x-wiki
The <b>Platinum Guard</b>, god of Justice and Judgement. A huge platinum [[dragon]] with brilliant scales and a great mane. One of the twelve gods of [[Verein Kirche von Arkhelle]], worshipped by [[St Anorad]], [[Father Traulam Eugen]], and Acting Captain of [[Kaarst City Watch]], [[Orryn Daergel]]. In fact, [[Kaarst]] has a high proportion of worshippers of <b>Bahamut</b>, and [[Kade Sirrine Kathedrale]] is the base of [[Cardinal Maurul Silkendawn]], the head of the church of Bahamut.
Bahamut represented the gods of good at the summit where the [[Divine Accord]] was signed. A huge marble sculpture in Kade Sirrine Kathedrale depicts Bahamut and [[Teli Monei]] signing the Divine Accord.
[[Kham]] carries a [[Badge of the Platinum Dragon]], and uses it several times to signal his authority, although he claims it carries no real weight anymore.
{{Characters}}
[[Category:Gods of Verein Kirche von Arkhelle]]
[[Category:Dragons]]
46a469149e1f9e213f542e9b3bae61cb5ead3960
Erathis
0
32
445
36
2024-04-10T14:55:43Z
Vicht
1
Added Characters navbox
wikitext
text/x-wiki
The <b>Architect Unceasing</b>, goddess of Civilization and Architecture. One of the twelve gods of [[Verein Kirche von Arkhelle]]. A woman who wears complicated patterns of navy, gold and grey.
{{Characters}}
[[Category:Gods of Verein Kirche von Arkhelle]]
95d25fc862ec333024c5fdfc69753f2f451b5502
Ioun
0
33
446
38
2024-04-10T14:55:46Z
Vicht
1
Added Characters navbox
wikitext
text/x-wiki
The <b>Knowing Mistress</b>, goddess of Knowledge and Prophecy. One of the twelve gods of [[Verein Kirche von Arkhelle]]. Often depicted in deep blue and bright fuschia, she has olive skin, silvered hair and a third eye in the middle of her forehead. All her eyes glow purple.
{{Characters}}
[[Category:Gods of Verein Kirche von Arkhelle]]
5ca9a8c0d3093d7d47f5d271bc84cb2f45460f7c
Kord
0
34
447
39
2024-04-10T14:55:50Z
Vicht
1
Added Characters navbox
wikitext
text/x-wiki
God of War and Battle. One of the twelve gods of [[Verein Kirche von Arkhelle]]. Often depicted in blood reds.
{{Characters}}
[[Category:Gods of Verein Kirche von Arkhelle]]
6753bd32bfda7f2dcd4a6dffdc21ae2210611cfa
Moradin
0
35
448
41
2024-04-10T14:55:53Z
Vicht
1
Added Characters navbox
wikitext
text/x-wiki
God of the Forge and of [[Dwarf|Dwarves]]. One of the twelve gods of [[Verein Kirche von Arkhelle]]. Dwarven god, statues of whom could be found inside [[Droghen's keep]]. [[Grokko]] retrieved a [[firebreathing potion]] from one such statue. Depicted with a fiery red beard working the forge.
{{Characters}}
[[Category:Gods of Verein Kirche von Arkhelle]]
[[Category:Dwarves]]
f16638133f64b8626af9d71adb1c043476575f51
Mystra
0
40
449
47
2024-04-10T14:55:58Z
Vicht
1
Added Characters navbox
wikitext
text/x-wiki
The <b>Seven Stars</b>, goddess of Magic. One of the twelve gods of [[Verein Kirche von Arkhelle]]. Her current name of <b>Mystra</b> was used by some tribes of [[human]]s back in the [[Age of Enlightenment]] when her worshippers and students in the [[Acropolis of Kereskaa]] called her <b>Kereskaa</b>.
Her symbol is that of seven stars, referencing the schools of magic, and the phrase is referenced often in writings about her. On the wall of [[Irann Rhogar]]'s house, the words ‘Petty tyrants of lesser gods will not stop us. Seven stars will burn bright this night.’ were written in the blood of two [[Raven Guard]]s. In the amphitheatre of the Acropolis of Kereskaa, the phrases ‘Seven stars light the night sky’, ‘Seven eyes perceive what hides’, and the partial phrases beginning ‘Seven hearts yearn for—’ and ‘Seven stars and seven—’ are carved in the walls in a language [[Mira]] doesn't recognize.
According to [[Suithrathus Luirmo]], Master of [[Divination]], Kereskaa and her most devoted students built the Acropolis to hide and secure the [[Dragon Orb of Drimysthonantas]], said to be able to control [[dragon|black dragons]] supposedly because it contains the soul of a [[Great Wyrm]] from the [[History|Age of Great Ruin]].
== Knives of Mystra ==
As arcane magic is forbidden in [[Kaarst]], where the other gods of Verein Kirche have stained glass windows in [[Kade Sirrine Kathedrale]], Mystra's window is blank, although there are a very few offerings on the altar beneath it. According to [[Uthan]], anyone who openly worships Mystra is followed and searched by members of the church or [[Kaarst City Watch]], and so those who do worship her do so in secret, calling themselves the [[Knives of Mystra]]. When asking about the history of this law, [[Father Glissan]] tells [[Vichthart]] the following.
<blockquote>‘Yes, Kaarst has some unpleasant history with the arcane, dates back to the [[History|Age of Decadence]]. When it joined the [[Arkhellen Empire|Empire]], the churches were united, some exceptions were made to allow the city to maintain its laws banning arcane practice. The worship of Mystra is not outlawed, the arcane practices are.</blockquote>
[[The Tide]] doesn't seem to think the Knives take part in anything dangerous, although some members led by the [[Ashmaker]] do attack [[Kham]] and [[Vichthart]] in the street at night, according to [[Reiner Hoss]], to make a public demonstration. During this attack, the Ashmaker cried out ‘Let it be known, the Faithful of Mystra will no longer be denied in this city,’ with witnesses clearly hearing the mention of Mystra and talking about it afterwards. On the pretense of helping to liberate the worshippers of Mystra, [[Etorn Hadaran]] and [[Irann Rhogar]] convinced members of the Knives to plant masses of explosive [[ashfire oil]] in a certain position underneath Kaarst, to be detonated at sunset on [[Calendar|15th Thelliea]], the same night that Rhogar was due to take part in a meeting of [[Kaarst City Council]].
{{Characters}}
[[Category:Gods of Verein Kirche von Arkhelle]]
390e65afd7e16f5f5a4dba4ba7e8afaeac031a36
Pelor
0
36
450
42
2024-04-10T14:56:01Z
Vicht
1
Added Characters navbox
wikitext
text/x-wiki
The <b>Dawn Father</b>, goddess of the Sun. One of the twelve gods of [[Verein Kirche von Arkhelle]]. Golden skinned and often depicted in golden yellows and bright oranges. Worshipped by the woman who was rescued from the [[manticore]] attacking the windmill north of [[Havenhaft]].
{{Characters}}
[[Category:Gods of Verein Kirche von Arkhelle]]
843c05e4680e829fe97d90318f5e8d53ee715c94
Raven Queen
0
41
451
48
2024-04-10T14:56:05Z
Vicht
1
Added Characters navbox
wikitext
text/x-wiki
The <b>Winter's Maiden</b>, goddess of Death, Winter and Fate. One of the twelve gods of [[Verein Kirche von Arkhelle]]. Depicted as a woman with a porcelain face dressed all in black. Her stained glass window in [[Kade Sirrine Kathedrale]] is the only one not to feature any bright colours, only black with small details in dark blue and crimson. [[Sable Warden Meriele Berevan]] is a leading cleric of the <b>Raven Queen</b>, based in [[Kaarst]], where there is a relatively high proportion of worshippers of the Raven Queen.
[[Thodris Holderheck]]'s mutilated remains were found below the largest statue of the Raven Queen in the [[Sombre Lyceum]], located in the north of the grounds. It is carved from black marble and depicts her shrouded in robes and wearing a deep hood, her face obscured by an expressionless yet somehow plaintive mask. A raven is perched on her right shoulder, and she is holding her hands out in front of her as if in prayer. The body of Thodris was arranged to mimic this pose.
It was only when [[Galesong Thervan Indále]] described this crime scene to [[Vichthart]] that the Sable Warden stopped silently looking out the window and turned to describe it as a travesty. The Raven Queen's followers particularly abhor murder and even more so [[necromancy]], seeing them as perversions of a person's natural fate. It was for this reason that Vichthart only felt comfortable trusting his potentially controversial findings with Meriele Berevan, who he knew would take a stern view of the presence of [[undead]] in Kaarrst.
According to the Sable Warden, the Raven Queen's origins go back to some time before the [[Great War]], when arcane magic was practised everywhere in the [[Material Plane]]. She began as a mortal woman and a powerful arcane mage who discovered the secrets to rise to godhood. She further adds that she is a god of magic who has grown in power over the years, who tends to attract those who are similar to her. Shortly before activating the circle of teleportation that takes the party to the [[Acropolis of Kereskaa]], the Sable Warden observes them carefully and makes the following comment.
<blockquote>Part of the purview of the Raven Queen is fate. How strange she would send such an eclectic group as yours. Pray that you do not fail.</blockquote>
{{Characters}}
[[Category:Gods of Verein Kirche von Arkhelle]]
4fd708b28714b79c247d4112e05252bcc5f623f0
Selune
0
37
452
43
2024-04-10T14:56:11Z
Vicht
1
Added Characters navbox
wikitext
text/x-wiki
The <b>Silver Crescent</b>, goddess of the Moon and the Night Sky. One of the twelve gods of [[Verein Kirche von Arkhelle]]. Represented by an [[elf|elven]] figure in dark blue robes, as well as by twilight purple colours. The moon of [[Talyen]] is called [[Asíl]].
{{Characters}}
[[Category:Gods of Verein Kirche von Arkhelle]]
[[Category:Elves]]
7df1dac2b1ed0aa8f11fd09ad92100445a83339c
Zaheer
0
43
453
390
2024-04-10T14:56:14Z
Vicht
1
Added Characters navbox
wikitext
text/x-wiki
The <b>Raging Tempest</b>, the <b>Mercurial Master of the Tempest</b>, god of Storm and Sea, known well to all who encounter storms in their travels. One of the twelve gods of [[Verein Kirche von Arkhelle]]. They have many depictions including male, female, and genderless, but they are consistently wrapped in shawls and robes, with long hair, all caught up in a wind. Depicted in colours of seagreen and deep grey and blue, frequently described as having great wings like a roc, or carrying a great stave of dark wood. <b>Zaheer</b> is known to be quite mercurial, and is prayed to for safe passage over the seas, but commands their followers to be resilient and devout.
When the party begins travelling to [[Senneborn]] to prevent any more ships attempting to approach [[Meeresdorf]], [[Vichthart]] asks [[Sarenrae]] to keep Zaheer protective of the waters to prevent any further shipwrecks while they travel. It later turns out the [[Zaheer island|island]] that [[Szegha Silthallow]] and [[Rrekkeh Stormcrawler]] are operating from used to house a temple to Zaheer built into the mountain. The [[gnoll]]s corrupt it using [[demon]]ic powers to create the unnatural storms. With the help of [[Kylian]] and the [[throat]]s, the party puts a stop to this.
Along with [[Bahamut]] and the [[Raven Queen]], their church is strongly represented in [[Kaarst]], including by [[Galesong Thervan Indále]], one of the leading clerics at [[Kade Sirrine Kathedrale]]. [[Squall's Beacon]] is dedicated to Zaheer, and their followers volunteer and pay respects there throughout the night. Volunteers there include devout dockworker [[Eurgaran Wihta]] (deceased) and [[Amnon Ingolidan]], as well as secret vampire [[Eldon Garrick]]. However, the seat of the Twin Cardinals of Zaheer is in [[Aern]], where the [[Fenwar Twins]] are based.
== Anrel ==
When the party tours Squall's Beacon, [[Anrel]] looks into the light of the beacon and registers it as cool and softly comforting, despite recognizing it as powerful magic. When the others head into the basement (and [[Mira]] discovers a section of hollow floor), Anrel remains on the ground level and pays his respects to Zaheer, unseen by his friends.
When a sting by the [[bone devil]] fills Anrel's body with poison and he falls unconscious underwater, he sees a flash of light above and swims upwards to find himself in a dark, endless ocean, the sky above him black and filled with thundering storm clouds. A voice carried by the wind asks him ‘You have called out to me, and now me to you. Who are you?’ and he answers ‘Anrel’. He swims against the current towards a small rocky island with a thin, gnarled tree covered in tattered cloth. As he looks up, the tree is replaced by a figure covered in shawls and long, white hair, streaming in the wind but unflinching. It asks him ‘Why do you fight?’, to which Anrel answers ‘To protect. For justice.’
When Anrel reaches the rocky shore, the figure is stood at the pinnacle of the island, it features seeming to change whenever a strand of cloth or hair blows in front of it, but they have wild and mad eyes like a goat's, black with white irises that seem to carry energy. It asks him ‘The strength to weather storms is not given, but earnt. Are you worthy?’ Anrel answers, ‘I guess I'll have to prove myself,’ and reaches for the figure's hand. He sees that it is covered in scars and tattoos in patterns of scattered waves and swirling wind, constantly shifting under its skin. When it next speaks, it's voice doesn't come from its lips but as a deep cracking of thunder that drowns out the surrounding noise: ‘Then prove it.’
When [[Grokko]] pulls Anrel to the surface, his armour is sparkling with electric energy, and when his eyes flutter open, luminous wings of crackling lightning sprout from his back. From somewhere above the cavern, everyone hears a sound like a crack of thunder. After killing the bone devil, Anrel's wings disappear and he falls unconscious to the ground. He does so again when he reaches the surface streets of Kaarst, and is taken to a [[house of healing]] where he takes three days to regain consciousness.
As the party learns, when they heard the crack of thunder underground, that was a bolt of lightning striking Squall's Beacon during a freak sudden storm, and it briefly shone with a burst of searing blue light without taking any damage. In the days that followed, a greater number of people were visiting the lighthouse and leaving tokens of their appreciation. Vichthart also noted that the glowing markings on the building's stone exterior were glowing brighter than they had before.
Galesong Thervan Indále recognized the intervention of Zaheer, and having likely heard the accounts of the rest of the party, was present in Anrel's room when he woke from his recovery (as was [[Cardinal Maurul Silkendawn]], but the Cardinal waited for the Galesong to finish his conversation with Anrel and depart before speaking). He points out the spiderweb of scars now present on Anrel's arms, and says that he believes Zaheer has reached out and touched Anrel. He offers to help Anrel in any way that seems necessary, even if that is only information and a pointer in the right direction, proposing the Fenwar Twins in Aern as his next destination. Anrel points out that he is no longer comfortable with religious symbols or organizations, but the Galesong points out that Zaheer values those who stand for themselves and carve their own path. He ends up agreeing with Anrel that they will jointly visit Squall's Beacon before Anrel leaves Kaart.
The next day, when [[Orianna]] invites the party to get drunk, Anrel declines, saying that he will instead visit Squall's Beacon.
{{Characters}}
[[Category:Gods of Verein Kirche von Arkhelle]]
48acaee39cb5c2ebd91ebdcb26c768e15b580b7a
Corellon
0
160
454
274
2024-04-10T14:56:19Z
Vicht
1
Added Characters navbox
wikitext
text/x-wiki
An [[elf|elven]] figure, a servant of whom presented the [[Acropolis of Kereskaa]] with a [[feywild tree|tree]] for its Orchard as thanks for ‘a good deed done,’ before the time of [[Master Suithrathus Luirmo]]'s tenure.
{{Characters}}
[[Category:Gods]]
551ca26149752a4292aaccc92a8f44393b81c4f2
Gruumsch
0
162
455
277
2024-04-10T14:56:22Z
Vicht
1
Added Characters navbox
wikitext
text/x-wiki
[[Orc]]ish god of war worshipped by the [[demon]]-summoning [[gnoll]]s that invaded [[Western Scharn]]. In the caves beneath the [[gnoll camp]], [[Grokko]] discovered and desecrated an altar that had originally been dwarven before gnolls repurposed it by hanging a bone trinket by a nail from the wall above the altar. The altar was located up a dead end, but the fact that there were fresh sacrifices on the altar indicated that gnolls travelled its length and therefore it wouldn't be safe for the party to rest there.
After Grokko defaced the altar by attaching one of his jars of preserved fish, it was detectable by [[Kham]]'s [[Detect Evil and Good]].
{{Characters}}
[[Category:Gods]]
f64478a8dc1fcb51df1b1b8dfbc7a9b12f3e9f9e
Aern
0
245
456
2024-04-10T15:21:27Z
Vicht
1
Created page with "A coastal settlement on the eastern extreme of the [[Roughspun Coast]], close to the borders with [[Ifkhamurud]]. It is the seat of the Twin Cardinals of [[Zaheer]], the [[Fenwar Twins]]. When [[Galesong Thervan Indále]] speaks to [[Anrel]] when he first wakes after three days' recovery in the [[house of healing]], amongst his suggestions is that Anrel could pay a visit to <b>Aern</b>. {{Locations}}"
wikitext
text/x-wiki
A coastal settlement on the eastern extreme of the [[Roughspun Coast]], close to the borders with [[Ifkhamurud]]. It is the seat of the Twin Cardinals of [[Zaheer]], the [[Fenwar Twins]].
When [[Galesong Thervan Indále]] speaks to [[Anrel]] when he first wakes after three days' recovery in the [[house of healing]], amongst his suggestions is that Anrel could pay a visit to <b>Aern</b>.
{{Locations}}
de66a243dc97da7429b1247199964db165d9f5b4
Heidestedt
0
246
457
2024-04-10T15:33:40Z
Vicht
1
Created page with "A coastal settlement on the [[Roughspun Coast]], east of [[Löwenalt]] across [[Salz Bay]]. Although it appears on the map of [[Western Scharn]], it is not part of the same headland. {{Locations}}"
wikitext
text/x-wiki
A coastal settlement on the [[Roughspun Coast]], east of [[Löwenalt]] across [[Salz Bay]]. Although it appears on the map of [[Western Scharn]], it is not part of the same headland.
{{Locations}}
6aa94fe7752d0587955e58eea1841768259f0cec
Salz Bay
0
247
458
2024-04-10T17:04:14Z
Vicht
1
Created page with "A bay of water on the [[Roughspun Coast]], separating [[Western Scharn]] from the headland to the east. <b>Salz Bay</b> separates [[Löwenalt]] in Western Scharn from [[Heidestedt]] to its east. [[Salzreich]] is located near the most inland point of Salz Bay. {{Locations}} [[Category:Bodies of water]]"
wikitext
text/x-wiki
A bay of water on the [[Roughspun Coast]], separating [[Western Scharn]] from the headland to the east. <b>Salz Bay</b> separates [[Löwenalt]] in Western Scharn from [[Heidestedt]] to its east. [[Salzreich]] is located near the most inland point of Salz Bay.
{{Locations}}
[[Category:Bodies of water]]
c796bad8cae9e00d4c8ebfe60d8204e0fe17987c
Salzreich
0
248
459
2024-04-10T18:19:18Z
Vicht
1
Created page with "Location on the [[Roughspun Coast]] east of [[Senneborn]] but west of [[Kaarst]], located near the most inland point of [[Salz Bay]], off the map of [[Western Scharn]]. <b>Salzreich</b> was the original destination of <i class="ship">[[Dancing in the Storm]]</i> before it lost its cargo and much of its crew. [[Claira Hanali]], the housekeeper for [[Ser Reginald Kobolwitz]], has family here, whom she visited for the three weeks before returning to work in Kobolwitz Mano..."
wikitext
text/x-wiki
Location on the [[Roughspun Coast]] east of [[Senneborn]] but west of [[Kaarst]], located near the most inland point of [[Salz Bay]], off the map of [[Western Scharn]]. <b>Salzreich</b> was the original destination of <i class="ship">[[Dancing in the Storm]]</i> before it lost its cargo and much of its crew. [[Claira Hanali]], the housekeeper for [[Ser Reginald Kobolwitz]], has family here, whom she visited for the three weeks before returning to work in [[Kobolwitz Manor]] on [[History|3rd Thirkuoss]].
{{Locations}}
65b84a7110ca33d94bffcfc7e2cfd22e0e38aa8e
Strandholm
0
249
460
2024-04-10T18:24:05Z
Vicht
1
Created page with "Location on the [[Roughspun Coast]] east of [[Senneborn]] but west of [[Kaarst]], off the map of [[Western Scharn]]. <b>Strandholm</b> was the original destination of [[Anrel]] before he began a blackout and awoke having been abducted by [[Detlef]]. Anrel may have stopped off at Strandholm during the 10-day journey from Senneborn to Kaarst, although he didn't share any particulars of such a visit with his friends [[Grokko]] and [[Vichthart]]. {{Locations}}"
wikitext
text/x-wiki
Location on the [[Roughspun Coast]] east of [[Senneborn]] but west of [[Kaarst]], off the map of [[Western Scharn]]. <b>Strandholm</b> was the original destination of [[Anrel]] before he began a blackout and awoke having been abducted by [[Detlef]]. Anrel may have stopped off at Strandholm during the 10-day journey from Senneborn to Kaarst, although he didn't share any particulars of such a visit with his friends [[Grokko]] and [[Vichthart]].
{{Locations}}
c9e5852efcf2d62b60023bde5f9ab06fe499b587
Wurzel Drain
0
243
461
396
2024-04-10T18:24:35Z
Vicht
1
Added Category:Wetlands
wikitext
text/x-wiki
A wetland in [[Western Scharn]] to the west of [[Darkwasser Wold]]. The westernmost tributary of the river that flows through the forest and on to [[Meeresdorf]] passes through <b>Wurzel Drain</b> on its way from its source towards [[Kusen]].
{{Locations}}
[[Category:Wetlands]]
575006790929682de79fc69efba6625f4d364991
File:Kaarst map 2023-02-15.png
6
250
462
2024-04-14T17:26:07Z
Vicht
1
Map of [[Kaarst]] saved 15 February 2023.
wikitext
text/x-wiki
== Summary ==
Map of [[Kaarst]] saved 15 February 2023.
c694f0a0049b8cb032cd03b76975ffb163d1cae1
Arnt
0
210
463
421
2024-04-14T17:27:58Z
Vicht
1
Moved navbox below image
wikitext
text/x-wiki
14- or 15-year-old child criminal who works with [[Detlef]]. She discovered him on the streets of [[Kaarst]] 3 years ago. Had a poor experience being raised in religious care homes and so refuses to go back to one, so the party instead recommends he finds work or apprenticeship in [[Senneborn]]. Leads the party to a hidden room behind the prison.
[[File:Arnt.png|thumb|center|upright=0.8|Arnt]]
{{Characters}}
[[Category:Criminals working for Droghen]]
bd500beb52049ddaf4427549b0640753833c7031
Kaarst
0
251
464
2024-04-14T23:31:17Z
Vicht
1
Created page with "[[File:Kaarst map 2023-02-15.png|thumb|right|upright=1.5|Map of Kaarst c. [[Timeline|1850 P.A.]]]] The capital city of [[Scharn]], located on the [[Roughspun Coast]]. Kaarst is known across the [[Arkhellen Empire]] as a very old and very idiosyncratic city, with its origins—and the origins of its unusual laws and traditions—long forgotten. In particular, the practice of arcane magic and ownership of enchanted items is forbidden. After a series of unsolved murders..."
wikitext
text/x-wiki
[[File:Kaarst map 2023-02-15.png|thumb|right|upright=1.5|Map of Kaarst c. [[Timeline|1850 P.A.]]]]
The capital city of [[Scharn]], located on the [[Roughspun Coast]].
Kaarst is known across the [[Arkhellen Empire]] as a very old and very idiosyncratic city, with its origins—and the origins of its unusual laws and traditions—long forgotten. In particular, the practice of arcane magic and ownership of enchanted items is forbidden.
After a series of unsolved murders and disappearances, Kaarst requests that [[Hellenhelm]] sends somebody to help them with the investigation. Being already in [[Western Scharn]] on unrelated business, [[Vichthart]] is dispatched and is accompanied by [[Anrel]] and [[Grokko]]. They team up with the foreign visitor [[Mira]], who has received a tip that he can find his missing tiefling friend in Kaarst, and cooperate the crime syndicate [[The Tide]], whose leader [[Orianna]] has come to Kaarst from Hellenhelm to resolve an increase in competing smuggling operations. They uncover a conspiracy of mages working with [[vampire]]s and [[devil]]s to cause havoc using the explosive [[ashfire oil]].
== Politics ==
The ruler of Kaarst is [[Governor Escherin]], whole office is located in [[Karmesin Palast]]. The Governor chairs the City Council, on which also sits members of the church, [[City Watch]] and a representative of the city's guilds, most recently [[Irann Rhogar]]. The City Council grants authority to guilds to perform their duties, such as the [[Waterworks Guild]], which maintains the city's sewers.
According to [[Leagallow Tiaathque]], the church of Kaarst exerts excessive influence over the politics of Kaarst, such as having full authority over the City Watch, and he believes that something is protecting the church's position. Anrel finds this plausible, knowing that [[Cardinal Maurul Silkendawn]] has never attended meetings in Hellenhelm as a cardinal would be expected to, and the [[Sable Warden Meriele Berevan]] has more influence than would be expected of a church official.
=== Church ===
Of the twelve gods in [[Verein Kirche von Arkhelle]], three have larger congregations in Kaarst: [[Bahamut]], [[Zaheer]] and the [[Raven Queen]]. The cardinal of Bahamat, Maurul Silkendawn, has his seat in [[Kade Sirrine Kathedrale]]. The other church leaders in Kaarst are the Sable Warden Meriele Berevan and the [[Galesong Thervan Indále]]. The church in Kaarst coordinates excursions into the [[Fuarcrùn Freeholds]] for the purposes of expanding the territory of the Arkhellen Empire, although most of them have been unsuccessful.
Despite being integrated with the national church of Verein Kirche, worshippers of [[Mystra]] have claimed that they are targetted for their beliefs, being followed and searched by City Watch on behalf of the church.
== History ==
{{Main|Timeline}}
Kaarst is located where an old city called <b>Farankaars</b> once stood. Farankaars was the location of the [[Acropolis of Kereskaa]], a place of study and worship to the god of magic, Kereskaa (known to humans as Mystra). In the [[Timeline|576th year of the Age of Enlightenment]], the Acropolis was attacked by the flying city of [[Kythera]] with the help of the traitor [[Teklanna Morantine]]. 3 days after surviving the initial attack, [[Elgrex Anderra]] believed that the city of Farankaars had fallen, although being confined to the Acropolis's [[Spire of Abjuration]], she couldn't have known for certain. In fact, Squall's Beacon likely dates back to the Age of Enlightenment.
Possibly during the Age of Decadence, Kaarst was ruled over by a [[Tyrant]] with arcane followers, who used their magic to enslave other arcane practitioners. This magic was used to raise a great statue of the Tyrant to the top of the cliffs above Kaarst Bay. However, the populace did not take kindly to the Tyrant's cruelty and overthrew him. Karmesin Palast is built on red rock (from which it takes its name) supposed to have been dyed by the volume of blood spilled at this time. The Tyrant's statue was toppled, and fell into the bay below, where now only one weathered stone hand can be seen above the water.
When the Arkhellen Empire was formed out of several territories including Scharn, Kaarst remained the capital city of the territory. Kade Sirrine Kathedrale was folded into Verein Kirche von Arkhelle, but as a compromise the city's law against magic practice was allowed to remain.
Anrel was raised by the church in Kaarst, and worked for them up until about 10 years ago, when he lost his entire platoon in [[Ùrlar Valley]] and abandoned his post. [[Detlef]] found [[Arnt]] on the streets of Kaarst three years ago.
=== Knives of Mystra ===
{{Main|Knives of Mystra}}
Citing unjust treatment by the local church, followers of Mystra eventually formed the [[Knives of Mystra]] who, under the influence of [[Irann Rhogar]] and [[Etorn Hadaran]], planned to collapse the cathedral and seize control of the city. After they were responsible for a number of murders and disappearances, as well as an increase in the smuggling of arcane items, the church in cast requested outside help from Hellenhelm, who sent Father Vichthart Fezzilbahn to investigate. Together with his friends Anrel, Grokko and Mira, they managed to stop the detonation of [[ashfire oil]] underneath the city, which led to the deaths and arrests of many members of the Knives.
== Geography ==
Kaarst is located on the Roughspun Coast, north of the westernmost lobe of [[Scharnwold]]. It is built on and around the cliffs around [[Kaarst Bay]], where the [[Mastaff River]] meets the Roughspun Coast. Despite being the capital city of Scharn, it is located fairly close to the borders with [[Arkhelle]] and [[Brenhalt]]. It is located ten days' travel by boat from [[Senneborn]] to the east, and twelve days' walk from Hellenhelm to the south, although the road leads through the Scharnwold, which is fabled for being filled with dangerous creatures. Nonetheless, Vichthart has travelled to Kaarst annually for several years without any concerning incidents.
The road into Kaarst has only one entrance to the city, through the single gateway in the city's outer wall, although the wall also lets the river flow through. The city itself is divided into five wards, each roughly corresponding to a section of socioeconomic status as well as being located at a respective height above the waterline. The entrance to the city leads to the main thoroughfare, which travels through the Rook Ward via the [[Ravensfair]], up between the Flock and Mastaff Wards, through the city's inner wall, through the Bell Ward and eventually into the Lamp Ward and up to Karmesin Palast.
=== Mastaff Ward ===
The largest section of Kaarst, named after the Mastaff River on which the city is built.It is the area that surrounds the harbour and docks, to the east and south of Kaarst Bay, including all the walled city west of the Mastaff River, and most of the islands in the bay. It borders the Flock and Rook Wards to the east, the Bell Ward to the north across the inner city wall, and the outer city to the south across the main city wall.
It is the poorest and most industrial part of the walled city, filled with shipworkers, sellers of fresh fish, leatherworkers and smiths, as well as the vast majority of the city's dock. The large island in the middle of the Mastraff River connected by Anshaung Bridge is the higher end of real estate in Mastaff Ward, with fancier merchant ships and traders. The Waterworks Guild Headquarters, Valiant Morgen Trading Company Kaarst Branch and The Baron's Cask are in the Mastaff Ward.
The party arrives by boat in the Mastaff Ward, from where they are escorted from by Orryn Daergel and the City Watch to Kade Sirrine Kathedrale in the Bell Ward. Grokko later leads Anrel and Mira around Mastaff Ward for seven hours trying to find The Copper Roost when Vichthart is waiting for them. Administrator Lorsalyn Pri born and raised in the Mastaff Ward.
Either Eren or Hilde was patrolling in the Mastaff Ward at the time Thodris Holderheck was murdered in Sombre Lyceum, while the other was on patrol in the Bell Ward.
=== Rook Ward ===
The entrance to Kaarst when arriving by foot, dominated by shopping and business, particularly the massive Ravensfair market place. It neighbours the Mastaff Ward to the west, Flock Ward to the north and Outer City to the southeast across the city wall and through the city's entrance gate.
The party stays at The Copper Roost throughout most of their time in Kaarst. Tiaathque's Medicinal Remedies is in the northern end of the Rook Ward, and Delilah's Delicatessen is at the northern tip, from where you can see Squall's Beacon. Miss Elira Lein runs Tiaathque's market stall in the Ravensfair, and many of the other shops and stalls in Kaarst are most likely in this area, such as Lily's Pastries and Baked Goods, Lion's Apothecary, The Night Stone, and The Sunken Giant.
It was in an alleyway off Ravensfair that Captain Felosiel Teinithra was last seen before his disappearance.
=== Flock Ward ===
A central section of Kaarst, albeit outsite the city's inner wall, named after the historic rearing of sheep on what were once fields and pastures. Sergeant Therai Doudra lives in the west of Flock Ward, where she stayed in recovery from her attack in an alleyway on [[Timeline|3rd Thelliea]]. When the party is contemplating disguising [[Uthan]] to use him to infiltrade the Knives of Mystra, Mira asks Grokko if he knows where to get a disguise kit; Grokko recalls a beauty parlour in the Flock Ward, but chooses to tell Mira he can't remember any.
=== Bell Ward ===
The architecture is older and more regal in the Bell Ward, with well-to-do taverns and temples, all dominated by Kade Sirrine Kathedrale. It borders the Lamp Ward to the west, the Flock Ward to the south, and partially the northern tip of the Mastaff Ward to the south. The homes are stately, though not as upmarket as in the Lamp Ward.
The party arrives by boat in the Mastaff Ward, from where they are escorted from by Orryn Daergel and the City Watch to Kade Sirrine Kathedrale in the Bell Ward. The Sombre Lyceum is nearby, and this area is also the location of the City Watch Headquarters, Kobolwitz Manor, and the stately but less impressive home of Irann Rhogar.
Either Eren or Hilde was patrolling in the Bell Ward at the time Thodris Holderheck was murdered in Sombre Lyceum, while the other was on patrol in the Mastaff Ward.
=== Lamp Ward ===
The highest part of Kaarst, located at the top of the cliffs to the north of Kaarst Bay, representing the richest part of the city, bordering only the Bell Ward to the east. Its highest points are Karmesin Palast and Squall's Beacon. It also contains the home of Captain Felosiel Teinithra and his husband Ruda. A path runs along the south edge of Lamp Ward, with only a thin strip of unused land between it and the edge of the cliff.
Acting captain Orryn Daergel points out there are manholes into the sewers across Lamp Ward. The homes here are stately, though not as fancy as in the Bell Ward. This is also likely to where the statue of the Tyrant was raised before it was toppled down the cliff and into Kaarst Bay.
=== Outer City ===
Where Kaarst has grown beyond its city wall. Located to the south the city wall, it is mostly poorer people and farmland.
=== Nearby ===
The [[Lightning Tree]] is located outside all developed parts of the city, east of the thoroughfare between the Flock and Rook wards. [[Tyrant's Folly]] is located in Kaarst Bay, having supposedly been collapsed from the clifftop that's now the Lamp Ward.
=== Undercity ===
Kaarst has a functioning sewer system that is maintained by the city's Waterworks Guild under the authority of the City Council. It is patrolled by exterminators and mercenaries who take care of the pests that infest the sewers. However, there are huge tracts of unexplored artificial tunnels under the city, both connected to and isolated from the known sewers. Some of these tunnels are used by criminals. Some sections of tunnel have collapsed into natural cave networks, one of which leads into huge underground caverns containing the ruins of the [[Acropolis of Kereskaa]].
{{Locations}}
48d3692da4f1aa1f27226aeb743439b87eadf8e8
465
464
2024-04-14T23:55:51Z
Vicht
1
Minor corrections, added links throughout
wikitext
text/x-wiki
[[File:Kaarst map 2023-02-15.png|thumb|right|upright=1.5|Map of Kaarst c. [[Timeline|1850 P.A.]]]]
The capital city of [[Scharn]], located on the [[Roughspun Coast]].
Kaarst is known across the [[Arkhellen Empire]] as a very old and very idiosyncratic city, with its origins—and the origins of its unusual laws and traditions—long forgotten. In particular, the practice of arcane magic and ownership of enchanted items is forbidden.
After a series of unsolved murders and disappearances, Kaarst requests that [[Hellenhelm]] sends somebody to help them with the investigation. Being already in [[Western Scharn]] on unrelated business, [[Vichthart]] is dispatched and is accompanied by [[Anrel]] and [[Grokko]]. They team up with the foreign visitor [[Mira]], who has received a tip that he can find his missing tiefling friend in Kaarst, and cooperate the crime syndicate [[The Tide]], whose leader [[Orianna]] has come to Kaarst from Hellenhelm to resolve an increase in competing smuggling operations. They uncover a conspiracy of mages working with [[vampire]]s and [[devil]]s to cause havoc using the explosive [[ashfire oil]].
== Politics ==
The ruler of Kaarst is [[Governor Escherin]], whole office is located in [[Karmesin Palast]]. The Governor chairs the City Council, on which also sits members of the church, [[City Watch]] and a representative of the city's guilds, most recently [[Irann Rhogar]]. The City Council grants authority to guilds to perform their duties, such as the [[Waterworks Guild]], which maintains the city's sewers.
According to [[Leagallow Tiaathque]], the church of Kaarst exerts excessive influence over the politics of Kaarst, such as having full authority over the City Watch, and he believes that something is protecting the church's position. Anrel finds this plausible, knowing that [[Cardinal Maurul Silkendawn]] has never attended meetings in Hellenhelm as a cardinal would be expected to, and the [[Sable Warden Meriele Berevan]] has more influence than would be expected of a church official.
=== Church ===
Of the twelve gods in [[Verein Kirche von Arkhelle]], three have larger congregations in Kaarst: [[Bahamut]], [[Zaheer]] and the [[Raven Queen]]. The cardinal of Bahamat, Maurul Silkendawn, has his seat in [[Kade Sirrine Kathedrale]]. The other church leaders in Kaarst are the Sable Warden Meriele Berevan and the [[Galesong Thervan Indále]]. The church in Kaarst coordinates excursions into the [[Fuarcrùn Freeholds]] for the purposes of expanding the territory of the Arkhellen Empire, although most of them have been unsuccessful.
Despite being integrated with the national church of Verein Kirche, worshippers of [[Mystra]] have claimed that they are targetted for their beliefs, being followed and searched by City Watch on behalf of the church.
== History ==
{{Main|Timeline}}
Kaarst is located where an old city called <b>Farankaars</b> once stood. Farankaars was the location of the [[Acropolis of Kereskaa]], a place of study and worship to the god of magic, Kereskaa (known to humans as Mystra). In the [[Timeline|576th year of the Age of Enlightenment]], the Acropolis was attacked by the flying city of [[Kythera]] with the help of the traitor [[Teklanna Morantine]]. 3 days after surviving the initial attack, [[Elgrex Anderra]] believed that the city of Farankaars had fallen, although being confined to the Acropolis's [[Spire of Abjuration]], she couldn't have known for certain. In fact, [[Squall's Beacon]] likely dates back to the Age of Enlightenment.
Possibly during the Age of Decadence, Kaarst was ruled over by a [[Tyrant]] with arcane followers, who used their magic to enslave other arcane practitioners. This magic was used to raise a great statue of the Tyrant to the top of the cliffs above [[Kaarst Bay]]. However, the populace did not take kindly to the Tyrant's cruelty and overthrew him. Karmesin Palast is built on red rock (from which it takes its name) supposed to have been dyed by the volume of blood spilled at this time. The Tyrant's statue was toppled, and fell into the bay below, where now only one weathered stone hand can be seen above the water.
When the Arkhellen Empire was formed out of several territories including Scharn, Kaarst remained the capital city of the territory. Kade Sirrine Kathedrale was folded into Verein Kirche von Arkhelle, but as a compromise the city's law against magic practice was allowed to remain.
Anrel was raised by the church in Kaarst, and worked for them up until about 10 years ago, when he lost his entire platoon in [[Ùrlar Valley]] and abandoned his post. [[Detlef]] found [[Arnt]] on the streets of Kaarst three years ago.
=== Knives of Mystra ===
{{Main|Knives of Mystra}}
Citing unjust treatment by the local church, followers of Mystra eventually formed the [[Knives of Mystra]] who, under the influence of [[Irann Rhogar]] and [[Etorn Hadaran]], planned to collapse the cathedral and seize control of the city. After they were responsible for a number of murders and disappearances, as well as an increase in the smuggling of arcane items, the church in cast requested outside help from Hellenhelm, who sent Father Vichthart Fezzilbahn to investigate. Together with his friends Anrel, Grokko and Mira, they managed to stop the detonation of [[ashfire oil]] underneath the city, which led to the deaths and arrests of many members of the Knives.
== Geography ==
Kaarst is located on the Roughspun Coast, north of the westernmost lobe of [[Scharnwald]]. It is built on and around the cliffs around Kaarst Bay, where the [[Mastaff River]] meets the Roughspun Coast. Despite being the capital city of Scharn, it is located fairly close to the borders with [[Arkhelle]] and [[Brenhalt]]. It is located ten days' travel by boat from [[Senneborn]] to the east, and twelve days' walk from Hellenhelm to the south, although the road leads through the Scharnwald, which is fabled for being filled with dangerous creatures. Nonetheless, Vichthart has travelled to Kaarst annually for several years without any concerning incidents.
The road into Kaarst has only one entrance to the city, through the single gateway in the city's outer wall, although the wall also lets the river flow through. The city itself is divided into five wards, each roughly corresponding to a section of socioeconomic status as well as being located at a respective height above the waterline. The entrance to the city leads to the main thoroughfare, which travels through the Rook Ward via the [[Ravensfair]], up between the Flock and Mastaff Wards, through the city's inner wall, through the Bell Ward and eventually into the Lamp Ward and up to Karmesin Palast.
=== Mastaff Ward ===
The largest section of Kaarst, named after the Mastaff River on which the city is built. It is the area that surrounds the harbour and docks, to the east and south of Kaarst Bay, including all the walled city west of the Mastaff River, and most of the islands in the bay. It borders the Flock and Rook Wards to the east, the Bell Ward to the north across the inner city wall, and the outer city to the south across the main city wall.
It is the poorest and most industrial part of the walled city, filled with shipworkers, sellers of fresh fish, leatherworkers and smiths, as well as the vast majority of the city's dock. The large island in the middle of the Mastraff River connected by [[Anshaung Bridge]] is the higher end of real estate in Mastaff Ward, with fancier merchant ships and traders. The Waterworks Guild Headquarters, [[Valiant Morgen Trading Company Kaarst Branch]] and [[The Baron's Cask]] are in the Mastaff Ward.
The party arrives by boat in the Mastaff Ward, from where they are escorted from by [[Orryn Daergel]] and the City Watch to Kade Sirrine Kathedrale in the Bell Ward. Grokko later leads Anrel and Mira around Mastaff Ward for seven hours trying to find [[The Copper Roost]] when Vichthart is waiting for them. [[Administrator Lorsalyn Pri]] born and raised in the Mastaff Ward.
Either [[Eren]] or [[Hilde]] was patrolling in the Mastaff Ward at the time [[Thodris Holderheck]] was murdered in [[Sombre Lyceum]], while the other was on patrol in the Bell Ward.
=== Rook Ward ===
The entrance to Kaarst when arriving by foot, dominated by shopping and business, particularly the massive Ravensfair market place. It neighbours the Mastaff Ward to the west, Flock Ward to the north and Outer City to the southeast across the city wall and through the city's entrance gate.
The party stays at The Copper Roost throughout most of their time in Kaarst. [[Tiaathque's Medicinal Remedies]] is in the northern end of the Rook Ward, and [[Delilah's Delicatessen]] is at the northern tip, from where you can see Squall's Beacon. Miss Elira Lein runs Tiaathque's market stall in the Ravensfair, and many of the other shops and stalls in Kaarst are most likely in this area, such as [[Kaarst Kebab Shop]], [[Lily's Pastries and Baked Goods]], [[Lion's Apothecary]], [[The Night Stone]], and [[The Sunken Giant]].
It was in an alleyway off Ravensfair that [[Captain Felosiel Teinithra]] was last seen before his disappearance.
=== Flock Ward ===
A central section of Kaarst, albeit outsite the city's inner wall, named after the historic rearing of sheep on what were once fields and pastures. [[Sergeant Therai Doudra]] lives in the west of Flock Ward, where she stayed in recovery from her attack in an alleyway on [[Timeline|3rd Thelliea]]. When the party is contemplating disguising [[Uthan]] to use him to infiltrate the Knives of Mystra, Mira asks Grokko if he knows where to get a [[disguise kit]]; Grokko recalls a beauty parlour in the Flock Ward, but chooses to tell Mira he can't remember any.
=== Bell Ward ===
The architecture is older and more regal in the Bell Ward, with well-to-do taverns and temples, all dominated by Kade Sirrine Kathedrale. It borders the Lamp Ward to the west, the Flock Ward to the south, and partially the northern tip of the Mastaff Ward to the south. The homes are stately, though not as upmarket as in the Lamp Ward.
The party arrives by boat in the Mastaff Ward, from where they are escorted from by Orryn Daergel and the City Watch to Kade Sirrine Kathedrale in the Bell Ward. The Sombre Lyceum is nearby, and this area is also the location of the City Watch Headquarters, [[Kobolwitz Manor]], and the stately but less impressive [[Irann Rhogar's home|home of Irann Rhogar]].
Either Eren or Hilde was patrolling in the Bell Ward at the time Thodris Holderheck was murdered in Sombre Lyceum, while the other was on patrol in the Mastaff Ward.
=== Lamp Ward ===
The highest part of Kaarst, located at the top of the cliffs to the north of Kaarst Bay, representing the richest part of the city, bordering only the Bell Ward to the east. Its highest points are Karmesin Palast and Squall's Beacon. It also contains the home of Captain Felosiel Teinithra and his husband [[Ruda]]. A path runs along the south edge of Lamp Ward, with only a thin strip of unused land between it and the edge of the cliff.
Acting captain Orryn Daergel points out there are manholes into the sewers across Lamp Ward. The homes here are stately, though not as fancy as in the Bell Ward. This is also likely to where the statue of the Tyrant was raised before it was toppled down the cliff and into Kaarst Bay.
=== Outer City ===
Where Kaarst has grown beyond its city wall. Located to the south the city wall, it is mostly poorer people and farmland.
=== Nearby ===
The [[Lightning Tree]] is located outside all developed parts of the city, east of the thoroughfare between the Flock and Rook wards. [[Tyrant's Folly]] is located in Kaarst Bay, having supposedly been collapsed from the clifftop that's now the Lamp Ward.
=== Undercity ===
Kaarst has a functioning sewer system that is maintained by the city's Waterworks Guild under the authority of the City Council. It is patrolled by exterminators and mercenaries who take care of the pests that infest the sewers. However, there are huge tracts of unexplored artificial tunnels under the city, both connected to and isolated from the known sewers. Some of these tunnels are used by criminals. Some sections of tunnel have collapsed into natural cave networks, one of which leads into huge underground caverns containing the ruins of the [[Acropolis of Kereskaa]].
{{Locations}}
05583d783dc11098c8ef5ab04fb6bff55902e475
Roughspun Coast
0
252
466
2024-04-15T00:34:07Z
Vicht
1
Created page with "The coastline of [[Scharn]] that borders the territory's northern, as well as eastern and western edges, and the body of water that separates the [[Arkhellen Empire]] from the [[Fuarcrùn Freeholds]]. Since the precise extent of the named coastline isn't know, it may also extend westwards along The [[Wüstenwast]] or eastwards along [[Ifkhamurud]]. Settlements that are located along the <b>Roughspun Coast</b> include [[Wüsthafen]], [[Kusen]], [[Meeresdorf]], Sennebor..."
wikitext
text/x-wiki
The coastline of [[Scharn]] that borders the territory's northern, as well as eastern and western edges, and the body of water that separates the [[Arkhellen Empire]] from the [[Fuarcrùn Freeholds]]. Since the precise extent of the named coastline isn't know, it may also extend westwards along The [[Wüstenwast]] or eastwards along [[Ifkhamurud]].
Settlements that are located along the <b>Roughspun Coast</b> include [[Wüsthafen]], [[Kusen]], [[Meeresdorf]], [[Senneborn]], and [[Löwenalt]] (all in [[Western Scharn]]), [[Salzreich]], [[Heidestedt]], [[Strandholm]], [[Kaarst]], and [[Aern]]. [[Salz Bay]] is a bay that separates Western Scharn from its neighbouring headland to the east. [[Scharnwald]] doesn't quite reach the Roughspun Coast, but its northern edge does run close to it east of Kaarst. <i class="ship">[[The Crested Eagle]]</i> and <i class="ship">[[Hope's Prize]]</i> are both ships that have navigated the waters of the Roughspun Coast
People living on the Roughspun Coast include a high proportion of adherants of Zaheer, being that the majority of travel occurs by boat. An [[Zaheer island|island]] off the coast of Western Scharn includes an ancient temple to Zaheer that has the power to control the nearby weather. One of the oldest surviving buildings in Kaarst is [[Squall's Beacon]], today a shrine to Zaheer. Aern is the seat of power for the Zaheer pillar of [[Verein Kirche von Archelle]], being the home of the [[Fenwar Twins]].
{{Locations}}
52fb8c119d452032d2cced17b2cc5e3ca58c989c
Acropolis
0
253
467
2024-04-16T14:40:30Z
Vicht
1
Redirected page to [[Acropolis of Kereskaa]]
wikitext
text/x-wiki
#REDIRECT [[Acropolis of Kereskaa]]
0d7b52dc95590f2359e78c8a9b183d97618135f6
Rusty dagger
0
254
468
2024-04-16T23:26:35Z
Vicht
1
Created page with "Mira picked this up from inside the chest of [[Cansa Cinsmic]]'s skeleton in her bedroom in the [[Spire of Conjuration]]. She was likely killed in her sleep by this item when the [[Acropolis of Kereskaa]] was attacked by [[Teklanna Morantine]] and the [[Kythera]]ns. Its rusted nature indicates there is nothing magical about it. In the three days after the [[party]] defeated the [[bone devil]], Mira sold the <b>rusty dagger</b> for 1 gold piece (half the price of a pristi..."
wikitext
text/x-wiki
Mira picked this up from inside the chest of [[Cansa Cinsmic]]'s skeleton in her bedroom in the [[Spire of Conjuration]]. She was likely killed in her sleep by this item when the [[Acropolis of Kereskaa]] was attacked by [[Teklanna Morantine]] and the [[Kythera]]ns. Its rusted nature indicates there is nothing magical about it. In the three days after the [[party]] defeated the [[bone devil]], Mira sold the <b>rusty dagger</b> for 1 gold piece (half the price of a pristine one), at the same time that he sold [[Irann Rhogar's candlestick]].
{{Items}}
[[Category:Items held by Mira]]
[[Category:Items sold]]
0691abe88ce3d9393e817690795f84dc053403dd
Slabbledab
0
11
469
420
2024-04-17T00:05:50Z
Vicht
1
wikitext
text/x-wiki
[[Goblin]] member of [[The Piß Keepers]]. Played by [[Neal]].
{{Characters}}
[[Category:Members of The Piß Keepers]]
[[Category:Characters played by Neal]]
[[Category:Goblins]]
3d221dfd993bd69cd39ab124fbfedc56a8aa939d
Vial of warm water
0
255
470
2024-04-17T23:14:38Z
Vicht
1
Created page with "[[Mira]] collects a small vial of the dregs of warm water left in a broken altar just south of the chamber of the Masters in the [[Acropolis of Kereskaa]]. Also inside the altar is the skeletal hand of [[Befrir Dalovamri]], pulled off at the wrist from the rest of his body when the Acropolis was split down its middle. His hand held the [[Seal]] of Enchantment, which [[Grokko]] took. {{Items}} [[Category:Items held by Mira]]"
wikitext
text/x-wiki
[[Mira]] collects a small vial of the dregs of warm water left in a broken altar just south of the chamber of the Masters in the [[Acropolis of Kereskaa]]. Also inside the altar is the skeletal hand of [[Befrir Dalovamri]], pulled off at the wrist from the rest of his body when the Acropolis was split down its middle. His hand held the [[Seal]] of Enchantment, which [[Grokko]] took.
{{Items}}
[[Category:Items held by Mira]]
e188fbabfee3a2a6ff45f584cb9920615010852e
Seal
0
256
471
2024-04-18T22:59:31Z
Vicht
1
Created page with "The <b>Seals</b> of the Masters of the [[Acropolis of Kereskaa]] are pendants worn by the eight leading scholars in charge of the Acropolis. They are primarily a sign of the wearer's station, but also have limited practical arcane use within the Acropolis. When the party visits the Acropolis of Kereskaa to stop the Knives of Mystra from detonating [[ashfire oil]] beneath [[Kade Sirrine Kathedrale]], they manage to recover seven of the eight of the Seals between them. =..."
wikitext
text/x-wiki
The <b>Seals</b> of the Masters of the [[Acropolis of Kereskaa]] are pendants worn by the eight leading scholars in charge of the Acropolis. They are primarily a sign of the wearer's station, but also have limited practical arcane use within the Acropolis.
When the party visits the Acropolis of Kereskaa to stop the Knives of Mystra from detonating [[ashfire oil]] beneath [[Kade Sirrine Kathedrale]], they manage to recover seven of the eight of the Seals between them.
== Appearance ==
Even after thousands of years they are untarnished. They all resemble golden discs with a central gemstone, although their individual appearances match the designs of their respective altars within the Acropolis. For example, the Seal of Conjuration is made of white gold filaments in elaborate shapes forming arcane sigils, with its gemstone a multicoloured opal; by comparison, the Seal of Illusion resembles a locket on a gold chain, but lacking a clasp to open it.
== Function ==
Each Seal can be worn in proximity to its matching Altar to amplify the effects of that school of magic. In practice, this allows a spell to be cast without requiring any material components or using a spell slot, once per day.
Some routes in the Acropolis can only be taken with the use of Seals.
* A door in the catacombs leading from beaneath the Spire of Transmutation to beneath the Spire of Conjuration can only be opened while wearing the Seal of Conjuration.
* The silvered dragon statues flanking the entrance to the meeting chamber of the Masters will only permit entrance to those wearing a Seal, blasting anyone else who attempts to pass them with ice cold wind.
* The entrance to the vault can only be opened by a majority of the Masters: It takes five people wearing their Seals and stating the respective Masters' names in unison to open the secret door inside the meeting chamber.
* The containment chambers inside the vault require multiple Seals to be in close proximity before they will open. Those on the left and right require three Seals, while the larger central door requires five Seals.
Additionally, the prison holding [[Vastren]] beneath the [[Spire of Conjuration]] can only be deactivated using three Seals along with a small incantation.
== Seals ==
{| class="wikitable"
! scope="col" | School
! scope="col" | Wearer
! scope="col" | Found
! scope="col" | Fate
|-
| [[Conjuration]]
| [[Cansa Cinsmic]]
| Mira took from Cansa's skeleton in her bedroom
| Mira gave to [[Sable Warden Meriele Berevan]]
|-
| [[Divination]]
| [[Suithrathus Luirmo]]
| Mira took from Suithrathus's skeleton in the [[Spire of Divination|Hall of Prophecies]]
| Held by Vichthart
|-
| [[Transmutation]]
| [[Toross Rhistel]]
| Mira took from Toross's skeleton inside his [[Spire of Transmutation|mirror device]]
| Mira gave to [[Sable Warden Meriele Berevan]]
|-
| [[Enchantment]]
| [[Befrir Dalovamri]]
| Grokko took from Befrir's skeletal hand inside the cracked altar in the [[Spire of Enchantment]]
| Held by Grokko
|-
| [[Illusion]]
| [[Farlu Naenreh]]
| Mira retrieved from the armour left by Farlu as a prize for completing his puzzle
| Held by Anrel
|-
| [[Necromancy]]
| [[Teklanna Morantine]]
| Picked up by Vichthart from the chamber that should have contained the [[Dragon Orb of Drimysthonontas]]
| Held by Vichthart
|-
| [[Abjuration]]
| [[Elgrex Anderra]]
| Mira took from the corpse of [[Etorn Hadaran]]
| Mira gave to [[Sable Warden Meriele Berevan]]
|-
| [[Evocation]]
| [[Vithra Rutgeth]]
| Kept by [[Leagallow Tiaathque]], having used it to create [[ashfire oil]] at the Seventh Altar
| Held by Tiaathque
|-
|}
== History ==
=== Finding Seals at random ===
The first Seal that the party finds is the Seal of Conjuration, which Mira takes from the chest of [[Cansa Cinsmic]]'s skeleton, which was lying in her bed in the Spire of Conjuration. He does this without anyone else in the party noticing.
The second Seal they find is the Seal of Divination, which is worn by the skeleton of [[Suithrathus Luirmo]]. Everyone sees Mira take this one, and [[Anrel]] is interrupted chastising Mira by the trapped form of Suithrathus making his presence known, to their surprise. Among the information he provides to the party is the identity and purpose of the Seals, admitting that he has no use of his own in his current form.
The third Seal is that of Transmutation, which Mira takes from the remains of [[Toross Rhistel]] that were trapped inside his mirror device, although only [[Grokko]] was present at the time. After picking this up, Grokko recognizes the glyph on a door outside as resembling that on the Seal of Conjuration. After some trial and error, Mira realises he can open the door if he's wearing the Seal around his neck. Unfortunately, his friends grow bored waiting for him to figure this out and head south. On his own, Mira heads north and finds [[Vastren]] being held in a prison. She explains that it would take three Seals to free her, but Vichthart and Anrel persuade Mira to leave before he can agree to unleash the devil.
When the party encounters the meeting chamber of the Masters, they decide to have the Seals distributed between them in case they become trapped inside and need to door to be opened again. Grokko takes the Seal of Divination from Mira, but Mira resists letting Vichthart take the Seal of Transmutation. Instead, he gives the Seal of Conjuration to the [[Raven Guards]] as they wait outside the council chamber. When the party turns back from the Vault, Mira takes the Seal of Conjuration back from the Raven Guards.
The fourth Seal they find is the Seal of Enchantment, which is held in the skeletal hand of [[Befrir Dalovamri]] in an altar of warm water. Grokko takes the Seal after using his axe to remove the bones, and confirms its identity with Suithrathus.
=== Requiring a fifth Seal ===
When the party meets [[Leagallow Tiaathque]] in the [[Spire of Evocation]], he confirms that [[Etorn Hadaran]] is wearing another of the Seals, and says that he can only be reached via the [[Spire of Abjuration]]. Knowing the kind of magic used to seal that Spire, Suithrathus admits that the only way they could enter would be to use the [[Obsidian Claw]], which they'll need five Seals to retrieve from the Acropolis's vault.
Anrel uses [[Locate Object]] to find any other Seals: At first he can't detect the Seal of Necromancy, but then he locates the Seal of Illusion, which Mira uses [[Levitate]] to head towards. Mira completes the puzzle set by [[Farlu Naenreh]] that reveals to him a mannequin wearing a set of [[purple studded leather armour]] that contains a golden locket devoid of a clasp. When he returns and shows it to Suithrathus, Suithrathus confirms it is the Seal of Illusion.
Now in possession of five Seals, they are able to retrieve the Obsidian Claw. Grokko keeps the Seal of Enchantment for himself and hands the Seal of Divination to Vichthart; Mira keeps the Seal of Transmutation, giving the Seal of Illusion to Anrel, and returning the Seal of Conjuration to the Raven Guards. As they approach the far side of the Acropolis's vault, they find three closed doors, each with a number of gems embedded in them. As they approach these doors, the gems in the doors and the gems in the closest same number of Seals glow sympathetically. The doors to the left and right, each requiring three Seals to open, respectively contain the Obsidian Claw and a [[unknown vault item|pouch in a crystal]] that Suithrathus refuses to describe.
The central, and largest of the doors requires five Seals to open. At Suithrathus's request, they check inside to make sure that the [[Dragon Orb of Drimysthonontas]] also remains in place. However, the pedestal inside is empty, with the Seal of Necromancy lying at its base. Suithrathus quickly concludes that [[Teklanna Morantine]] must have betrayed the rest of the Acropolis to work with the Kytherans.
=== The fate of the Seals ===
When the party uses the Obsidian Claw to enter the Spire of Abjuration, a hologram of [[Elgrex Anderra]] plays, in which she is wearing her Seal of Abjuration while describing how she has heard the attack on the Acropolis from the safety of her Spire, and intends to leave, find any other survivors, and head to [[Geat-Mea]]. After the party defeats the [[bone devil]], Mira retrieves the Seal of Abjuration from the boneless corpse of Etorn Hadaran, suggesting that Elgrex never did leave the ruins of the Acropolis. He also takes the Seal of Conjuration back from the Raven Guards.
While Vichthart and Anrel return to finalise their deal with Tiaathque, who has the Seal of Evocation and has been using it to manufacture the [[ashfire oil]] at the so-called Seventh Altar, Mira and Grokko go to visit Vastren. They use the three Seals they have between them to release Vastren from her prison, although they do not reveal this to Vicht or Anrel.
When Mira later meets with the [[Sable Warden Meriele Berevan]], he hands the Seals of Transmutation, Conjuration and Abjuration to her. She describes them as having very little function outside of the Acropolis, being mostly badges of office, with what little enchantment they have seeming tied to the inner workings of the Acropolis itself. She says that her recommendation will be for the Seals to be held securely to prevent anyone from making their way back into the vault.
{{Items}}
[[Category:Items held by Anrel]]
[[Category:Items held by Grokko]]
[[Category:Items previously held by Mira]]
[[Category:Items held by Vichthart]]
2f8ac7da349216d2e777e70ded9ffe9dcdec62ee
Golden key
0
257
472
2024-04-18T23:05:06Z
Vicht
1
Created page with "When [[Mira]] completes the puzzle set by [[Farlu Naenreh]] in the catacomb beneath the [[Spire of Illusion]], it opens a small chamber at the south end of the room. Inside this is a <b>golden key</b> that Mira pockets, as well as the [[purple studded leather armour]] containing the [[Seal of Illusion]]. {{Items}} [[Category:Items held by Mira]] [[Category:Keys]]"
wikitext
text/x-wiki
When [[Mira]] completes the puzzle set by [[Farlu Naenreh]] in the catacomb beneath the [[Spire of Illusion]], it opens a small chamber at the south end of the room. Inside this is a <b>golden key</b> that Mira pockets, as well as the [[purple studded leather armour]] containing the [[Seal of Illusion]].
{{Items}}
[[Category:Items held by Mira]]
[[Category:Keys]]
221ba87449c4af202c0889a39dc75b516f546e5b
Etorn Hadaran's pocketwatch
0
169
473
287
2024-04-18T23:05:49Z
Vicht
1
wikitext
text/x-wiki
After the [[bone devil]] is killed, [[Mira]] goes to [[Etorn Hadaran]]'s skeleton-less corpse and retrieves his <b>pocketwatch</b>, 60 silver pieces, his [[Etorn Hadaran's spellbook|spellbook]] and the [[Seal|Seal of Abjuration]].
Mira presents the timepiece to [[Sable Warden Meriele Berevan]] as a gift. She appraises it as being well made and expensive, then points out that since the [[Raven Queen]] is always counting every second, it is a very appropriate gift.
[[Category:Items previously held by Mira]]
afec0e879e409de4937f22558773f8c9efb7ffea
Purple studded leather armour
0
258
474
2024-04-18T23:15:51Z
Vicht
1
Created page with "When [[Mira]] completes the puzzle set by [[Farlu Naenreh]] in the catacomb beneath the [[Spire of Illusion]], it opens a small chamber at the south end of the room. Inside this is a [[golden key]] that Mira pockets, as well as a set of <b>studded leather armour</b> worn by a wooden mannequin. The armour is finely crafted from dark leather, with lots of organic curving shapes. It is dyed <b>purple</b>, and has small elements of silver running through it. When Mira finds..."
wikitext
text/x-wiki
When [[Mira]] completes the puzzle set by [[Farlu Naenreh]] in the catacomb beneath the [[Spire of Illusion]], it opens a small chamber at the south end of the room. Inside this is a [[golden key]] that Mira pockets, as well as a set of <b>studded leather armour</b> worn by a wooden mannequin.
The armour is finely crafted from dark leather, with lots of organic curving shapes. It is dyed <b>purple</b>, and has small elements of silver running through it. When Mira finds it, it has a fine gold chain in one of its pockets.
Mira takes the armour from the mannequin and wears it underneath his normal robes, finding that it is warm with magic. Once he's wearing it, he pulls on the gold chain, which is attached to a kind of golden locket lacking a clasp. [[Suithrathus Luirmo]] later identifies this as the [[Seal of Illusion]].
The mannequin that wore the armour when Mira found it is attached to a bust of his own face (at that time, gender-swapped by the mirror device beneath the [[Spire of Transmutation]]) with a smug grin. Before Mira leaves, he gives the bust a thumbs up, but as he turns to leave, he is convinced the bust winks at him.
{{Items}}
[[Category:Items held by Mira]]
2cdc58ff909001b0a97e4c2d981a17990345e63d
Seals
0
259
475
2024-04-18T23:16:09Z
Vicht
1
Redirected page to [[Seal]]
wikitext
text/x-wiki
#REDIRECT [[Seal]]
eab420778f3379b04e35d3c801287332adf7d854
Seal of Conjuration
0
260
476
2024-04-18T23:16:27Z
Vicht
1
Redirected page to [[Seal]]
wikitext
text/x-wiki
#REDIRECT [[Seal]]
eab420778f3379b04e35d3c801287332adf7d854
Seal of Divination
0
261
477
2024-04-18T23:16:43Z
Vicht
1
Redirected page to [[Seal]]
wikitext
text/x-wiki
#REDIRECT [[Seal]]
eab420778f3379b04e35d3c801287332adf7d854
Seal of Transmutation
0
262
478
2024-04-18T23:16:59Z
Vicht
1
Redirected page to [[Seal]]
wikitext
text/x-wiki
#REDIRECT [[Seal]]
eab420778f3379b04e35d3c801287332adf7d854
Seal of Enchantment
0
263
479
2024-04-18T23:17:13Z
Vicht
1
Redirected page to [[Seal]]
wikitext
text/x-wiki
#REDIRECT [[Seal]]
eab420778f3379b04e35d3c801287332adf7d854
Seal of Necromancy
0
264
480
2024-04-18T23:17:39Z
Vicht
1
Redirected page to [[Seal]]
wikitext
text/x-wiki
#REDIRECT [[Seal]]
eab420778f3379b04e35d3c801287332adf7d854
Seal of Abjuration
0
265
481
2024-04-18T23:18:03Z
Vicht
1
Redirected page to [[Seal]]
wikitext
text/x-wiki
#REDIRECT [[Seal]]
eab420778f3379b04e35d3c801287332adf7d854
Seal of Evocation
0
266
482
2024-04-18T23:18:14Z
Vicht
1
Redirected page to [[Seal]]
wikitext
text/x-wiki
#REDIRECT [[Seal]]
eab420778f3379b04e35d3c801287332adf7d854
MediaWiki:Sidebar
8
149
483
259
2024-04-21T16:38:29Z
Vicht
1
Added Items and Categories links
wikitext
text/x-wiki
* navigation
** mainpage|mainpage-description
** recentchanges-url|recentchanges
** randompage-url|randompage
//** helppage|help-mediawiki
* Pages
** Sessions|Sessions
** Timeline|Timeline
** Calendar|Calendar
** Characters|Characters
** Locations|Locations
** Items|Items
** Special:Categories|Categories
* SEARCH
* TOOLBOX
* LANGUAGES
a32304696f382b4154c97c6aa97823749f264a7f
Ser Kobolwitz's scimitar
0
267
484
2024-04-21T22:19:39Z
Vicht
1
Created page with "<b>Ser Kobolwitz's scimitar</b> is a scimitar belonging to [[Ser Reginald Kobolwitz]], depicted in many of the paintings around [[Kobolwitz Manor]] although its current location is unknown. It is made of well-polished black steel with a mirrored black and platinum inlay in the pattern of stars. Its hilt is blue-tinted and carved into the shape of an owl with glittering yellow [[topaz]] for eyes. After seeing the scimitar in many of the paintings hung around Kobolwitz M..."
wikitext
text/x-wiki
<b>Ser Kobolwitz's scimitar</b> is a scimitar belonging to [[Ser Reginald Kobolwitz]], depicted in many of the paintings around [[Kobolwitz Manor]] although its current location is unknown.
It is made of well-polished black steel with a mirrored black and platinum inlay in the pattern of stars. Its hilt is blue-tinted and carved into the shape of an owl with glittering yellow [[topaz]] for eyes.
After seeing the scimitar in many of the paintings hung around Kobolwitz Manor, the party finds a scimitar in the trophy room. However, they note that it is on the floor by the feet of a mannequin displaying [[Ser Kobolwitz's armour]], rather than being held by the mannueqin or being part of any display. Later, when they find the secret compartment in the basement, they find a mount that perfectly holds the scimitar they've found. They reason that Ser Kobolwitz had a replica of his real sword, which they found upstairs, while his real sword was kept hidden underground, either because it was arcane contraband or simply because it was valuable.
In the basement the party finds the dead body of a human man, later identified as [[Esker]], holding a crumpled up note in his fist.
<blockquote>{{Notes:Kobolwitz Manor Tide note}}</blockquote>
The party speculates that [[Arnuanna|J]] and [[Esker|E]] were sent to steal Ser Kobolwitz's scimitar by [[Orianna|V]], but then one of them betrayed the other. (The party further guesses that it was J betrayed by E on the basis that the note was being held by J, to whom it was addressed; however, they later learn that it was Esker who was betrayed by [[Arnuanna]].)
[[Anrel]] uses [[Locate Item]] to determine that the scimitar is not within 1000 feet of Kobolwitz Manor. The next afternoon, the party informs acting captain [[Orryn Daergel]] of the scimitar being missing, and he informs them that any arcane items would have been taken to the church for safekeeping, while his personal affects may still be held by them.
{{Items}}
[[Category:Weapons]]
956566013c5a0902bf8caca840fcc61d4beb4ad0
Timeline
0
5
485
373
2024-04-22T01:14:05Z
Vicht
1
Revision of all descriptions not involving the party; Ancient History changed to definition list; all relative dates changed to approximate absolute dates (except in Ancient History)
wikitext
text/x-wiki
There have been eight Ages, although none among the party can remember the numbering of them. The current year is 1853 Post-Accord (or P.A.).
== Ancient history ==
; Age of Great Ruin
: The soul of a Great Wyrm from this time comes to held in the [[Dragon Orb of Drimysthonontas]].
; Age of Enlightenment
: [[Squall's Beacon]] is constructed, possibly in [[Farankaars]].
: [[Kereskaa]] contains the Dragon Orb of Drimysthonontas. The [[Acropolis of Kereskaa]] is built on top of it.
: A servant of [[Corellon]] gifts a [[feywild tree|tree from the Feywild]] to the Acropolis of Kereskaa for ‘a good deed done’.
: [[Suithrathus Luirmo]] begins his tenure at Acropolis of Kereskaa
: Veteran of the [[Blood Wars]], [[Vastren]] is summoned into the catacomb beneath the [[Spire of Conjuration]] by [[Cansa Cinsmic]]. Vastren describes her as ‘Lost, blind, and running out of time.’
: 576th year of the Age of Enlightenment, approximately 1150 years before the [[Divine Accord]]. [[Teklanna Morantine]] betrays the Acropolis of Kereskaa to the [[Kythera]]ns, who destroy the Acropolis. Suithrathus Luirmo transfers himself to his divining mirror to stay alive. [[Toross Rhistel]] becomes trapped in his mirror device, where he later perishes. [[Elgrex Anderra]] is kept safe in the [[Spire of Abjuration]]. Most of the other Masters and students die in the attack. After three days, Elgrex records a holographic message to her unknown lover, saying she will try to find survivors and travel to [[Geat-Mea]], but her [[Seal]] is eventually found—presumably within the Acropolis—by [[Etorn Hadaran]], suggesting she never escaped. Teklanna Morantine steals the Dragon Orb of Drimysthonontas from the vault.
; Age of Decadence
: A [[Tyrant]] rules [[Kaarst]] with his aid of his arcane followers. The wield magic to enslave other arcane practitioners, and use that magic to raise a giant statue of the Tyrant to the clifftop above the city. The populace does not take kindly to the cruelty and overthrow the Tyrant. His statue is collapsed into [[Kaarst Bay]] where only its hand reaches above the surface, coming to be known as [[Tyrant's Folly]].
; [[Great War]]
: Lasting several hundred years, many souls were lost. Much of the destruction was performed by mages. Flying cities like [[Kythera]] were used as weapons.
: The [[Divine Accord]] ends the Great War. The gods of good and evil agree not to visit the [[Material Plane]]. The Divine Accord is signed by [[Bahamut]] and [[Teli Monei]] at a summit later depicted by a sculpture in [[Kade Sirrine Kathedrale]].
; A little over 500 years ago
: The most recent appearance of the comet [[Ashtkaan]] in the skies above [[Talyen]].
== Recent history==
All years are approximations based on ages (known and apparent) and statements liable to inaccuracy and rounding.
; Approximately 3 generations ago
: The founding of the [[Arkhellen Empire]]. 12 churches are united as [[Verein Kirche von Arkhelle]], although a compromise is made to allow [[Kaarst]] to keep its laws against practising arcane magic.
; 1764–1773
: Birth of [[Maurul Silkendawn]], who now appears to be in his eighties.
; 1794–1798
: Birth of [[Reginald Kobolwitz]], who was in his late fifties when he died.
; 1806
: Birth of [[Traulam Eugen]], who is now 47.
; 1818
: Birth of [[Lorenzo Arkhelle]], who is now 35.
; 1841
: [[King Lorenzo Friedriche Arkhelle XVI]] becomes 3rd Emperor of the Arkhellen Empire.
; 1843
: [[Anrel Salier]] is living in [[Kaarst]] having been raised by the church there.
; 1844
: [[Mirark]]'s tiefling friend disappears
; 1845
: [[Amnon Ingolidan]] begins working at [[Squall's Beacon]].
: [[Ruda]] and [[Felosiel Teinithra]] marry.
; 1846
: [[Anrel Salier]] leads his platoon into [[Ùrlar Valley]] to investigate a strange excavation. He loses consciousness and wakes up far away. He believes is the only survivor and does not return to Kaarst.
; 1846–1847
: [[Felosiel Teinithra]] becomes captain of [[Kaarst City Watch]].
; 1848
: [[Kham Gohlrim]] is the only person still speaking to [[Elira Lein]].
; 1850
: [[Armine Detlef]] discovers [[Arnt]] on the streets of [[Kaarst]].
: [[Eurgaran Wihta]] begins working at [[Squall's Beacon]].
: [[Orryn Daergel]] is promoted from Private to Sergeant in [[Kaarst City Watch]].
; 1851
: [[Ruda]] and [[Felosiel Teinithra]] move to their current home in the [[Lamp Ward]].
== 1853 Post-Accord ==
; Seanchai
: [[Kham Gohlrim]] departs his post and disappears. [[Cardinal Maurul Silkendawn]] assumes he has gone to find [[Anrel Salier]].
; 25 Skaerentsa
: [[Captain Adran Mokam]] and boatswain [[Thava Windreaver]] are found dead on the lower deck of <i class="ship">[[Hope's Prize]]</i> by the ship's crew while docked in [[Kaarst]].
; Late Skaerensta
: [[Beatrux]] is brought to the [[Zaheer island]] as a slave by [[gnoll]]s.
; 12 Maneseed
: [[Claira Hanali]] visits family in [[Salzreich]], three weeks before returning to work at [[Kobolwitz Manor]].
; Early Maneseed
: [[Valiant Morgen Trading Company]] purchases a [[Valiant Morgen Trading Company warehouse|warehouse]] in Kaarst.
; 19 Maneseed
: [[Father Traulam Eugen]] attempts to meet the [[Tide]] in Kaarst but is ambushed and taken for questioning by the [[Knives of Mystra]].
; 20 Maneseed
: Officials from [[Kade Sirrine Kathedrale]] contact [[Karst City Watch]] to let them know that Father Traulam Eugen did not return to his quarters as expected.
; 3 Thirkuoss
: Claira Hanali discovers [[Ser Reginald Kobolwitz]] dead in his drawing room, having been killed by a [[vampire]] several days earlier.
; 9 Thirkuoss
: [[Thodris Holderhek]] is likely killed in the evening while working in the [[Sombre Lyceum]].
; 10 Thirkuoss
: Thodris Holderhek's body is found in the Sombre Lyceum by mourners in the early morning.
: [[Anrel Salier]] cuts off [[Armine Detlef]]'s arm.
; 15 Thirkuoss
: [[Eurgaran Wihta]] leaves home in the evening but does not arrive at [[Squall's Beacon]]. It is likely he is ambushed by [[Eldon Garrick]] and taken to his torture chamber underneath the lighthouse.
; 16 Thirkuoss
: [[Heda Wihta]] reports her husband missing to Kaarst City Watch in the early morning.
; 17 Thirkuoss
: [[Eurgaran Wihta]]'s body is found floating in the harbour by a group of dockworkers early in the morning.
; 25 Thirkuoss
: Party arrives at [[gnoll]] camp in [[Aleph Marsh]]
; 26 Thirkuoss
: Slaves are freed from [[gnoll]] camp and sail to [[Meeresdorf]]
; 27 Thirkuoss
: Party arrives on the [[Zaheer island|island]] and escapes the slave camp
; 28 Thirkuoss
: Party meets ghosts and [[troglodyte|lizard-type folk]] in the [[Zaheer island|island]] caves
; 29 Thirkuoss
: [[Srir Silthallow]] is defeated but [[Rrekkeh Stormcrawler]] escapes
; 30 Thirkuoss
: Survivors leave the [[Zaheer island|island]] aboard <i class="ship">[[Dancing in the Storm]]</i>
; 31 Thirkuoss
: <i class="ship">[[Dancing in the Storm]]</i> departs [[Meeresdorf]] for [[Senneborn]]
; 1 Thelliea
: <i class="ship">[[Dancing in the Storm]]</i> arrives in [[Senneborn]]; Party departs for [[Kaarst]]
; 3 Thelliea
: [[Captain Felosial Teinithra]] and [[Sergeant Therai Doudra]] patrol narrow side streets of [[Ravensfair]] late at night. Sgt Doudra is knocked unconscious, Cpt Teinithra is abducted by the [[Knives of Mystra]].
; 4 Thelliea
: Sergeant Therai Doudra reports her assault to Kaarst City Watch.
; 11 Thelliea
: Party arrives in [[Kaarst]], visits [[Kade Sirrine Kathedrale]], [[Mira]] joins
; 12 Thelliea
: Party visits [[Kobolwitz Manor]] and [[Squall's Beacon]]
; 13 Thelliea
: Discovery and stakeout of [[Valiant Morgen warehouse]], [[Ashmaker]] attacks
; 14 Thelliea
: Interrogation of captives, jailbreak of [[Uthan]], meeting [[the Tide]], investigating [[Valiant Morgen Trading Company|Valiant Morgen]]
; 15 Thelliea
: [[Sable Warden]] sends party to [[Acropolis of Karaskaa]], party stops [[Knives of Mystra]] just before sunset, planned meeting of [[Kaarst City Council]] is abandoned
; 16 Thelliea
: <i class="ship">[[Hope's Prize]]</i> was due to depart [[Kaarst]]
; 18 Thelliea
: [[Anrel]] awakes in the [[house of healing]] near [[Kade Sirrine Kathedrale]].
; 19 Thelliea
: The [[Galesong Thervan Indále|Galesong]] and [[Sable Warden Meriele Berevan|Sable Warden]] have a final debrief with the heroes of [[Kaarst]]
4059712181bbafcaeb0c01c265d70af4e445b0ae
Esker
0
268
486
2024-04-22T12:37:44Z
Vicht
1
Created page with "Human man and member of the [[Tide]] whom the party found dead in the basement of [[Kobolwitz Manor]] on [[Timeline|12 Thelliea]]. The party found and unlocked the secret compartment hidden behind the wine racks in [[Ser Reginald Kobolwitz]]'s wine cellar. Inside they found a dead man with multiple stab wounds in his back, who had been dead for at least a week. In his fist he held a crumpled note. <blockquote>{{Notes:Kobolwitz Manor Tide note}}</blockquote> Because he..."
wikitext
text/x-wiki
Human man and member of the [[Tide]] whom the party found dead in the basement of [[Kobolwitz Manor]] on [[Timeline|12 Thelliea]].
The party found and unlocked the secret compartment hidden behind the wine racks in [[Ser Reginald Kobolwitz]]'s wine cellar. Inside they found a dead man with multiple stab wounds in his back, who had been dead for at least a week. In his fist he held a crumpled note.
<blockquote>{{Notes:Kobolwitz Manor Tide note}}</blockquote>
Because he was holding it, the party assumed the dead man was the addressee referred to as J, and speculated that he had been betrayed by the person referred to as E, who must have taken [[Ser Kobolwitz's scimitar]].
On the evening of 14 Thelliea, the party meets [[Orianna]] in [[The Baron's Cask]], who explains that J is her brother [[Arnuanna]], E is <b>Esker</b>, and V is herself. Since Esker is a human man and Arnuanna is a tiefling, it was Orianna's brother who betrayed and killed Esker.
{{Characters}}
[[Category:Members of the Tide]]
[[Category:Humans]]
[[Category:Deceased characters]]
e8e2ecaa7c2e57052136842a93ba920af6a89187
491
486
2024-04-22T13:14:28Z
Vicht
1
Added link to Human
wikitext
text/x-wiki
[[Human]] man and member of the [[Tide]] whom the party found dead in the basement of [[Kobolwitz Manor]] on [[Timeline|12 Thelliea]].
The party found and unlocked the secret compartment hidden behind the wine racks in [[Ser Reginald Kobolwitz]]'s wine cellar. Inside they found a dead man with multiple stab wounds in his back, who had been dead for at least a week. In his fist he held a crumpled note.
<blockquote>{{Notes:Kobolwitz Manor Tide note}}</blockquote>
Because he was holding it, the party assumed the dead man was the addressee referred to as J, and speculated that he had been betrayed by the person referred to as E, who must have taken [[Ser Kobolwitz's scimitar]].
On the evening of 14 Thelliea, the party meets [[Orianna]] in [[The Baron's Cask]], who explains that J is her brother [[Arnuanna]], E is <b>Esker</b>, and V is herself. Since Esker is a human man and Arnuanna is a tiefling, it was Orianna's brother who betrayed and killed Esker.
{{Characters}}
[[Category:Members of the Tide]]
[[Category:Humans]]
[[Category:Deceased characters]]
64e2c78342640876685fee96c5c61f5a584337d5
Ogak
0
219
487
432
2024-04-22T12:39:05Z
Vicht
1
Added Category:Deceased characters
wikitext
text/x-wiki
[[Hobgoblin]] in the [[gnoll encampment]] who is somehow expecting the party's arrival. He is the leader of Droghen's forces in the camp, and the other [[goblin]]s and hobgoblins don't attack the party even without them having to show their [[symbol of Bane]]. <b>Ogak</b> describes the layout and situation to the party. Later his head is seen worn on a [[gnoll]]'s belt.
{{Characters}}
[[Category:Criminals working for Droghen]]
[[Category:Hobgoblins]]
[[Category:Deceased characters]]
12a414775353c1f2e6616d7d5b32578b9591bbc7
Hilta
0
216
488
429
2024-04-22T12:40:08Z
Vicht
1
Added Category:Deceased characters
wikitext
text/x-wiki
Smuggler working under [[Detlef]]. Knows that [[Davin]] is skimming off the top and warns him to stop before Detlef finds out. They're unsuccessful, and Davin is caught and killed.
{{Characters}}
[[Category:Criminals working for Droghen]]
[[Category:Deceased characters]]
9c10711385927aac98a79a52c8413fc04f50093b
489
488
2024-04-22T12:40:57Z
Vicht
1
Undo revision [[Special:Diff/488|488]] by [[Special:Contributions/Vicht|Vicht]] ([[User talk:Vicht|talk]])
wikitext
text/x-wiki
Smuggler working under [[Detlef]]. Knows that [[Davin]] is skimming off the top and warns him to stop before Detlef finds out. They're unsuccessful, and Davin is caught and killed.
{{Characters}}
[[Category:Criminals working for Droghen]]
cef184a75c55a48d33a7444d828e4d5e3ec9f889
Davin
0
214
490
425
2024-04-22T12:41:14Z
Vicht
1
Added Category:Deceased characters
wikitext
text/x-wiki
Smuggler working under [[Detlef]], who stole a necklace and snuck about in restricted places without being caught. Their friend [[Hilta]] urged them to stop misbehaving for their own safety, but they were caught stashing gold elsewhere and were killed for it.
{{Characters}}
[[Category:Criminals working for Droghen]]
[[Category:Deceased characters]]
4b72454b4815f7e5f8877980d49e62e6013d0fb1
Category:Artificers
14
269
492
2024-04-22T20:27:49Z
Vicht
1
Created page with "[[Category:Classes]]"
wikitext
text/x-wiki
[[Category:Classes]]
c7a8a09cab3da81f1c01a92e5ef1e3020c3b5f55
Category:Clerics
14
270
493
2024-04-22T20:27:51Z
Vicht
1
Created page with "[[Category:Classes]]"
wikitext
text/x-wiki
[[Category:Classes]]
c7a8a09cab3da81f1c01a92e5ef1e3020c3b5f55
Category:Warlocks
14
271
494
2024-04-22T20:27:54Z
Vicht
1
Created page with "[[Category:Classes]]"
wikitext
text/x-wiki
[[Category:Classes]]
c7a8a09cab3da81f1c01a92e5ef1e3020c3b5f55
Category:Bugbears
14
272
495
2024-04-22T20:28:20Z
Vicht
1
Created page with "[[Category:Races]]"
wikitext
text/x-wiki
[[Category:Races]]
be20582db2093a65cfb6015042a560052e89c3a5
Category:Dragons
14
273
496
2024-04-22T20:29:02Z
Vicht
1
Created page with "[[Category:Races]]"
wikitext
text/x-wiki
[[Category:Races]]
be20582db2093a65cfb6015042a560052e89c3a5
Category:Dwarves
14
274
497
2024-04-22T20:29:04Z
Vicht
1
Created page with "[[Category:Races]]"
wikitext
text/x-wiki
[[Category:Races]]
be20582db2093a65cfb6015042a560052e89c3a5
Category:Elves
14
275
498
2024-04-22T20:29:07Z
Vicht
1
Created page with "[[Category:Races]]"
wikitext
text/x-wiki
[[Category:Races]]
be20582db2093a65cfb6015042a560052e89c3a5
Category:Gnomes
14
276
499
2024-04-22T20:29:10Z
Vicht
1
Created page with "[[Category:Races]]"
wikitext
text/x-wiki
[[Category:Races]]
be20582db2093a65cfb6015042a560052e89c3a5
Category:Goblins
14
277
500
2024-04-22T20:29:13Z
Vicht
1
Created page with "[[Category:Races]]"
wikitext
text/x-wiki
[[Category:Races]]
be20582db2093a65cfb6015042a560052e89c3a5
Category:Gods
14
278
501
2024-04-22T20:29:16Z
Vicht
1
Created page with "[[Category:Races]]"
wikitext
text/x-wiki
[[Category:Races]]
be20582db2093a65cfb6015042a560052e89c3a5
Category:Half-elves
14
279
502
2024-04-22T20:29:19Z
Vicht
1
Created page with "[[Category:Races]]"
wikitext
text/x-wiki
[[Category:Races]]
be20582db2093a65cfb6015042a560052e89c3a5
Category:Halflings
14
280
503
2024-04-22T20:29:22Z
Vicht
1
Created page with "[[Category:Races]]"
wikitext
text/x-wiki
[[Category:Races]]
be20582db2093a65cfb6015042a560052e89c3a5
Category:Hobgoblins
14
281
504
2024-04-22T20:29:25Z
Vicht
1
Created page with "[[Category:Races]]"
wikitext
text/x-wiki
[[Category:Races]]
be20582db2093a65cfb6015042a560052e89c3a5
Category:Humans
14
282
505
2024-04-22T20:29:27Z
Vicht
1
Created page with "[[Category:Races]]"
wikitext
text/x-wiki
[[Category:Races]]
be20582db2093a65cfb6015042a560052e89c3a5
Category:Kenku
14
283
506
2024-04-22T20:29:30Z
Vicht
1
Created page with "[[Category:Races]]"
wikitext
text/x-wiki
[[Category:Races]]
be20582db2093a65cfb6015042a560052e89c3a5
Category:Kobolds
14
284
507
2024-04-22T20:29:32Z
Vicht
1
Created page with "[[Category:Races]]"
wikitext
text/x-wiki
[[Category:Races]]
be20582db2093a65cfb6015042a560052e89c3a5
Category:Tieflings
14
285
508
2024-04-22T20:29:37Z
Vicht
1
Created page with "[[Category:Races]]"
wikitext
text/x-wiki
[[Category:Races]]
be20582db2093a65cfb6015042a560052e89c3a5
Category:Characters played by Erik
14
286
509
2024-04-22T20:30:15Z
Vicht
1
Created page with "[[Category:Player characters]]"
wikitext
text/x-wiki
[[Category:Player characters]]
849a35beb731408b393204b0d563e18ea0b6130e
Category:Characters played by Manco
14
287
510
2024-04-22T20:30:17Z
Vicht
1
Created page with "[[Category:Player characters]]"
wikitext
text/x-wiki
[[Category:Player characters]]
849a35beb731408b393204b0d563e18ea0b6130e
Category:Characters played by Neal
14
288
511
2024-04-22T20:30:21Z
Vicht
1
Created page with "[[Category:Player characters]]"
wikitext
text/x-wiki
[[Category:Player characters]]
849a35beb731408b393204b0d563e18ea0b6130e
Category:Characters played by Traggey
14
289
512
2024-04-22T20:30:23Z
Vicht
1
Created page with "[[Category:Player characters]]"
wikitext
text/x-wiki
[[Category:Player characters]]
849a35beb731408b393204b0d563e18ea0b6130e
Category:Characters played by Wil
14
290
513
2024-04-22T20:30:27Z
Vicht
1
Created page with "[[Category:Player characters]]"
wikitext
text/x-wiki
[[Category:Player characters]]
849a35beb731408b393204b0d563e18ea0b6130e
Category:Player characters
14
291
514
2024-04-22T20:30:50Z
Vicht
1
Created page with "[[Category:Characters]]"
wikitext
text/x-wiki
[[Category:Characters]]
52f882e537c3212533581f6c826cf9bfa42de14e
Category:Heroes
14
292
515
2024-04-22T20:32:04Z
Vicht
1
Created page with "[[Category:Player characters]]"
wikitext
text/x-wiki
[[Category:Player characters]]
849a35beb731408b393204b0d563e18ea0b6130e
536
515
2024-04-22T20:34:43Z
Vicht
1
Correction
wikitext
text/x-wiki
[[Category:Characters]]
52f882e537c3212533581f6c826cf9bfa42de14e
Category:Members of The Piß Keepers
14
293
516
2024-04-22T20:32:07Z
Vicht
1
Created page with "[[Category:Player characters]]"
wikitext
text/x-wiki
[[Category:Player characters]]
849a35beb731408b393204b0d563e18ea0b6130e
535
516
2024-04-22T20:34:38Z
Vicht
1
Correction
wikitext
text/x-wiki
[[Category:Characters]]
52f882e537c3212533581f6c826cf9bfa42de14e
Category:Members of Verein Kirche von Arkhelle
14
294
517
2024-04-22T20:32:10Z
Vicht
1
Created page with "[[Category:Player characters]]"
wikitext
text/x-wiki
[[Category:Player characters]]
849a35beb731408b393204b0d563e18ea0b6130e
534
517
2024-04-22T20:34:32Z
Vicht
1
Correction
wikitext
text/x-wiki
[[Category:Characters]]
52f882e537c3212533581f6c826cf9bfa42de14e
Category:Members of the Iron Tempest Mercenary Company
14
295
518
2024-04-22T20:32:13Z
Vicht
1
Created page with "[[Category:Player characters]]"
wikitext
text/x-wiki
[[Category:Player characters]]
849a35beb731408b393204b0d563e18ea0b6130e
533
518
2024-04-22T20:34:28Z
Vicht
1
Correction
wikitext
text/x-wiki
[[Category:Characters]]
52f882e537c3212533581f6c826cf9bfa42de14e
Category:Members of the Tide
14
296
519
2024-04-22T20:32:16Z
Vicht
1
Created page with "[[Category:Player characters]]"
wikitext
text/x-wiki
[[Category:Player characters]]
849a35beb731408b393204b0d563e18ea0b6130e
532
519
2024-04-22T20:34:22Z
Vicht
1
Correction
wikitext
text/x-wiki
[[Category:Characters]]
52f882e537c3212533581f6c826cf9bfa42de14e
Category:Missing persons
14
297
520
2024-04-22T20:32:19Z
Vicht
1
Created page with "[[Category:Player characters]]"
wikitext
text/x-wiki
[[Category:Player characters]]
849a35beb731408b393204b0d563e18ea0b6130e
531
520
2024-04-22T20:34:17Z
Vicht
1
Correction
wikitext
text/x-wiki
[[Category:Characters]]
52f882e537c3212533581f6c826cf9bfa42de14e
Category:People who have lost an arm to Anrel
14
298
521
2024-04-22T20:32:22Z
Vicht
1
Created page with "[[Category:Player characters]]"
wikitext
text/x-wiki
[[Category:Player characters]]
849a35beb731408b393204b0d563e18ea0b6130e
530
521
2024-04-22T20:34:13Z
Vicht
1
Correction
wikitext
text/x-wiki
[[Category:Characters]]
52f882e537c3212533581f6c826cf9bfa42de14e
Category:Worshippers of Sarenrae
14
299
522
2024-04-22T20:32:25Z
Vicht
1
Created page with "[[Category:Player characters]]"
wikitext
text/x-wiki
[[Category:Player characters]]
849a35beb731408b393204b0d563e18ea0b6130e
529
522
2024-04-22T20:34:07Z
Vicht
1
Correction
wikitext
text/x-wiki
[[Category:Characters]]
52f882e537c3212533581f6c826cf9bfa42de14e
Category:Criminals working for Droghen
14
300
523
2024-04-22T20:32:30Z
Vicht
1
Created page with "[[Category:Player characters]]"
wikitext
text/x-wiki
[[Category:Player characters]]
849a35beb731408b393204b0d563e18ea0b6130e
528
523
2024-04-22T20:33:59Z
Vicht
1
Correction
wikitext
text/x-wiki
[[Category:Characters]]
52f882e537c3212533581f6c826cf9bfa42de14e
Category:Deceased characters
14
301
524
2024-04-22T20:32:33Z
Vicht
1
Created page with "[[Category:Player characters]]"
wikitext
text/x-wiki
[[Category:Player characters]]
849a35beb731408b393204b0d563e18ea0b6130e
527
524
2024-04-22T20:33:54Z
Vicht
1
Correction
wikitext
text/x-wiki
[[Category:Characters]]
52f882e537c3212533581f6c826cf9bfa42de14e
Category:Fezzilbahn family
14
302
525
2024-04-22T20:32:36Z
Vicht
1
Created page with "[[Category:Player characters]]"
wikitext
text/x-wiki
[[Category:Player characters]]
849a35beb731408b393204b0d563e18ea0b6130e
526
525
2024-04-22T20:33:48Z
Vicht
1
Correction
wikitext
text/x-wiki
[[Category:Characters]]
52f882e537c3212533581f6c826cf9bfa42de14e
Category:Items held by Anrel
14
303
537
2024-04-22T20:37:52Z
Vicht
1
Created page with "[[Category:Items held by heroes]]"
wikitext
text/x-wiki
[[Category:Items held by heroes]]
d876b0211e454a3ce29d5debafc9fcfccb7d2b4c
Category:Items held by Grokko
14
304
538
2024-04-22T20:37:56Z
Vicht
1
Created page with "[[Category:Items held by heroes]]"
wikitext
text/x-wiki
[[Category:Items held by heroes]]
d876b0211e454a3ce29d5debafc9fcfccb7d2b4c
Category:Items held by Mira
14
305
539
2024-04-22T20:38:00Z
Vicht
1
Created page with "[[Category:Items held by heroes]]"
wikitext
text/x-wiki
[[Category:Items held by heroes]]
d876b0211e454a3ce29d5debafc9fcfccb7d2b4c
Category:Items held by Vichthart
14
306
540
2024-04-22T20:38:03Z
Vicht
1
Created page with "[[Category:Items held by heroes]]"
wikitext
text/x-wiki
[[Category:Items held by heroes]]
d876b0211e454a3ce29d5debafc9fcfccb7d2b4c
Category:Items in the Bag of Holding
14
307
541
2024-04-22T20:38:11Z
Vicht
1
Created page with "[[Category:Items held by heroes]]"
wikitext
text/x-wiki
[[Category:Items held by heroes]]
d876b0211e454a3ce29d5debafc9fcfccb7d2b4c
Category:Items previously held by Mira
14
308
542
2024-04-22T20:38:39Z
Vicht
1
Created page with "[[Category:Items previously held by heroes]]"
wikitext
text/x-wiki
[[Category:Items previously held by heroes]]
cab17be571d8bbc8573f4a8254328103ef0299ac
Rusty dagger
0
254
543
468
2024-04-22T20:39:06Z
Vicht
1
wikitext
text/x-wiki
Mira picked this up from inside the chest of [[Cansa Cinsmic]]'s skeleton in her bedroom in the [[Spire of Conjuration]]. She was likely killed in her sleep by this item when the [[Acropolis of Kereskaa]] was attacked by [[Teklanna Morantine]] and the [[Kythera]]ns. Its rusted nature indicates there is nothing magical about it. In the three days after the [[party]] defeated the [[bone devil]], Mira sold the <b>rusty dagger</b> for 1 gold piece (half the price of a pristine one), at the same time that he sold [[Irann Rhogar's candlestick]].
{{Items}}
[[Category:Items held by Mira]]
[[Category:Items sold]]
[[Category:Weapons]]
4d1c75923c813445b795fd3544cb89d36a27b9a3
Category:Mineral items
14
309
544
2024-04-22T20:39:23Z
Vicht
1
Created page with "[[Category:Items]]"
wikitext
text/x-wiki
[[Category:Items]]
8bd3beebb2826830a9eade77bf73f03d8286ea27
Category:Weapons
14
310
545
2024-04-22T20:39:25Z
Vicht
1
Created page with "[[Category:Items]]"
wikitext
text/x-wiki
[[Category:Items]]
8bd3beebb2826830a9eade77bf73f03d8286ea27
Category:Written items
14
311
546
2024-04-22T20:39:29Z
Vicht
1
Created page with "[[Category:Items]]"
wikitext
text/x-wiki
[[Category:Items]]
8bd3beebb2826830a9eade77bf73f03d8286ea27
Category:Keys
14
312
547
2024-04-22T20:54:09Z
Vicht
1
Created page with "[[Category:Items]]"
wikitext
text/x-wiki
[[Category:Items]]
8bd3beebb2826830a9eade77bf73f03d8286ea27
Arnuanna
0
313
548
2024-04-22T22:19:21Z
Vicht
1
Created page with "[[Tiefling]] man from [[Leurisan]], member of the [[Tide]] in [[Kaarst]], and brother of [[Orianna]]. On [[Timeline|12 Thelliea]] the party found [[Esker]] dead in the secret compartment hidden behind the wine racks in [[Ser Reginald Kobolwitz]]'s wine cellar. In his fist he held a crumpled note. <blockquote>{{Notes:Kobolwitz Manor Tide note}}</blockquote> Because he was holding it, the party assumed the dead man was the addressee referred to as J, and speculated that..."
wikitext
text/x-wiki
[[Tiefling]] man from [[Leurisan]], member of the [[Tide]] in [[Kaarst]], and brother of [[Orianna]].
On [[Timeline|12 Thelliea]] the party found [[Esker]] dead in the secret compartment hidden behind the wine racks in [[Ser Reginald Kobolwitz]]'s wine cellar. In his fist he held a crumpled note.
<blockquote>{{Notes:Kobolwitz Manor Tide note}}</blockquote>
Because he was holding it, the party assumed the dead man was the addressee referred to as J, and speculated that he had been betrayed by the person referred to as E, who must have taken [[Ser Kobolwitz's scimitar]], and possibly also [[Ser Kobolwitz's necklace|his necklace]].
On the evening of 14 Thelliea, the party met [[Orianna]] in [[The Baron's Cask]], who explained that J is her brother <b>Arnuanna</b>, E is [[Esker]], and V is herself. Since Esker is a human man and Arnuanna is a tiefling, it was Orianna's brother who betrayed and killed Esker. She explained that Arnuanna never returned from that mission, prompting the party to suspect he had joined the [[Knives of Mystra]] like [[Uthan]] had.
In the three days following the party's defeat of the [[bone devil]],
After the party defeated the [[bone devil]], [[Vichthart]] made sure to check the defeated Knives of Mystra they'd fought in the cavern beneath [[Kade Sirrine Kathedrale]], but none of them was a tiefling. He also visited [[Kaarst City Watch Headquarters]] to check if any of the incarcerated members of the Knives were tieflings, but again none of them was. In the three days that followed, [[Mira]] asked Orianna if she'd ever seen the [[twinned flame]] symbol before, and she recalled seeing it on a piece of paper that Arnuanna had, which seemed to her to be a letter with a seal. Mira explained that it was the symbol of the assassin faction of the [[Conflagracy]], the ruling power of [[Dhintay]].
On 19 Thelliea, the party met with [[Galesong Thervan Indále]] and [[Sable Warden Meriele Berevan]] in [[Kade Sirrine Kathedrale]] for a final debrief. They went through the salient points of, amongst other things, [[Irann Rhogar's journal]] now that they'd had time to investigate it properly. [[Irann Rhogar]] had actually written about meeting a tiefling named Arnuanna, who had acted as his liaison with a benefactor and advisor (whose identity Rhogarr hadn't written about). Shortly before his death, Rhogar had written that Arnuanna was planning to leave for [[Brenhalt]].
The party jointly passed this information on to Orianna at The Baron's Cask, who decided that her next destination after escorting [[Father Traulam Eugen]] to [[Senneborn]] would be Brenhalt to try and locate her brother.
{{Characters}}
[[Category:Members of the Tide]]
[[Category:Tieflings]]
53577b95b40af1fc20e60aad488bfb65b6cf73ab
550
548
2024-04-23T00:09:08Z
Vicht
1
Added Category:Missing persons
wikitext
text/x-wiki
[[Tiefling]] man from [[Leurisan]], member of the [[Tide]] in [[Kaarst]], and brother of [[Orianna]].
On [[Timeline|12 Thelliea]] the party found [[Esker]] dead in the secret compartment hidden behind the wine racks in [[Ser Reginald Kobolwitz]]'s wine cellar. In his fist he held a crumpled note.
<blockquote>{{Notes:Kobolwitz Manor Tide note}}</blockquote>
Because he was holding it, the party assumed the dead man was the addressee referred to as J, and speculated that he had been betrayed by the person referred to as E, who must have taken [[Ser Kobolwitz's scimitar]], and possibly also [[Ser Kobolwitz's necklace|his necklace]].
On the evening of 14 Thelliea, the party met [[Orianna]] in [[The Baron's Cask]], who explained that J is her brother <b>Arnuanna</b>, E is [[Esker]], and V is herself. Since Esker is a human man and Arnuanna is a tiefling, it was Orianna's brother who betrayed and killed Esker. She explained that Arnuanna never returned from that mission, prompting the party to suspect he had joined the [[Knives of Mystra]] like [[Uthan]] had.
In the three days following the party's defeat of the [[bone devil]],
After the party defeated the [[bone devil]], [[Vichthart]] made sure to check the defeated Knives of Mystra they'd fought in the cavern beneath [[Kade Sirrine Kathedrale]], but none of them was a tiefling. He also visited [[Kaarst City Watch Headquarters]] to check if any of the incarcerated members of the Knives were tieflings, but again none of them was. In the three days that followed, [[Mira]] asked Orianna if she'd ever seen the [[twinned flame]] symbol before, and she recalled seeing it on a piece of paper that Arnuanna had, which seemed to her to be a letter with a seal. Mira explained that it was the symbol of the assassin faction of the [[Conflagracy]], the ruling power of [[Dhintay]].
On 19 Thelliea, the party met with [[Galesong Thervan Indále]] and [[Sable Warden Meriele Berevan]] in [[Kade Sirrine Kathedrale]] for a final debrief. They went through the salient points of, amongst other things, [[Irann Rhogar's journal]] now that they'd had time to investigate it properly. [[Irann Rhogar]] had actually written about meeting a tiefling named Arnuanna, who had acted as his liaison with a benefactor and advisor (whose identity Rhogarr hadn't written about). Shortly before his death, Rhogar had written that Arnuanna was planning to leave for [[Brenhalt]].
The party jointly passed this information on to Orianna at The Baron's Cask, who decided that her next destination after escorting [[Father Traulam Eugen]] to [[Senneborn]] would be Brenhalt to try and locate her brother.
{{Characters}}
[[Category:Members of the Tide]]
[[Category:Tieflings]]
[[Category:Missing persons]]
e26dde6c4e7b16bf2354cf1e892c87338e70e81e
Maghn Ünthergol
0
314
549
2024-04-23T00:08:30Z
Vicht
1
Created page with "Seven years before he returned to [[Kaarst]], [[Anrel]] had led a platoon to [[Ùrlar Valley]] in the [[Fuarcrùn Freeholds]]. Anrel himself blacked out and woke up elsewhere, believing all who'd served under him were now dead. When the party met with [[Orianna]] on [[Timeline|19 Thelliea]], Anrel gave a list of his soldiers to Orianna and asked if the [[Tide]] could try to locate any of the individuals. He prevented [[Mira]] from looking at the list, but Mira did manag..."
wikitext
text/x-wiki
Seven years before he returned to [[Kaarst]], [[Anrel]] had led a platoon to [[Ùrlar Valley]] in the [[Fuarcrùn Freeholds]]. Anrel himself blacked out and woke up elsewhere, believing all who'd served under him were now dead.
When the party met with [[Orianna]] on [[Timeline|19 Thelliea]], Anrel gave a list of his soldiers to Orianna and asked if the [[Tide]] could try to locate any of the individuals. He prevented [[Mira]] from looking at the list, but Mira did manage to see the name <b>Maghn Ünthergol</b>.
[[Category:Soldiers in Anrel's platoon]]
[[Category:Missing persons]]
475e556622943934042e72c13dd7ed5afa7be3a8
Vichthart
0
2
551
415
2024-04-23T00:14:53Z
Vicht
1
Fixed Kham to Anrel
wikitext
text/x-wiki
<b><dfn>Father Vichthart Fezzilbahn</dfn></b>, affectionately called <b>Priestman</b> by [[Grokko]], is a member of clergy within [[Verein Kirche von Arkhelle]] and a priest of the goddess of redemption, [[Sarenrae]]. He is a relatively quiet and reserved man, tending to let actions occur around him, but years of travel, as well as recent events, have kept him a stalwart defender when travelling alone or with others. Although he isn't a confident conversationalist, he is a fastidious keeper of notes that he keeps to present to his highers up within the church, and given time he can prepare a competent speech and deliver it with enthusiasm.
Normally Vichthart, or just Vicht, lives at home with his wife—[[Anastel]]—and their three children in a quaint village where he is the local priest, delivering sermons and supporting the spiritual and personal lives of his parishioners. However, he annually travels around the western end of the [[Roughspun Coast]] in order to audit the records of tithes collected by churches in that area. He has grown familiar with the priests along his route, including [[Father Traulam Eugen]] in [[Senneborn]], and he enjoys meeting other individuals on his annual trip. Years of solo travel have accustomed him to tackling the occasional thug, [[goblin]] or wild animal on the road.
On his most recent trip to [[Scharn]], Vichthart was travelling on <i class="ship">[[The Crested Eagle]]</i> when it sank off the coast near [[Meeresdorf]]. A word from Sarenrare though helped him to survive and swim to shore along with Grokko, [[Kenneth]] and the unconscious [[Lania Falst]]. Learning from the harbourmaster [[Solomon Dugraf]] that all ships off this coast have mysteriously sunk in inexplicable storms, Vicht and his companions are thrust into the responsibility of defending [[Western Scharn]] from an incursion of [[demon]]-worshipping [[gnoll]]s led by [[Srir Silthallow]] and [[Rrekkeh Stormcrawler]]. After closing their portal on a small, forgotten island, instead of being able to continue his regular duties or return home, Vichthart was summoned to [[Kaarst]] to provide outside assistance in the investigation of a string of murders and disappearances. Taking Grokko and [[Anrel]] with him, and teaming up with newcomer to the empire [[Mira]], they uncovered and disrupted a conspiracy of mages plotting with [[devil]]s and [[vampire]]s to detonate heavy explosives underneath the city.
Vichthart is originally from [[Heldruh]], just north of the imperial capital [[Hellenhelm]], but studied to become a priest in [[Baumeln]], a town on the border of [[Arkhelle]], Scharn and [[Denkrei]]. He stays overnight in Kaarst every year at the start of his rounds, staying at [[The Copper Roost]], although he doesn't enjoy the noise and bustle of cities, nor the idiosyncratic laws and clergy of Kaarst. Nevertheless, while he waits for his friends to find him in the city, he manages to drink enough to become slightly merry. He has only occasionally reached the limits of his patience, being incensed at the theft of the [[platinum gauntlet]] holy relic from the [[Church of St Anorad]], and throwing one gnoll off a bridge in a rage after first encountering the demons they'd summoned.
Vichthart is loyal to Verein Kirche von Arkhelle, reporting to [[Father Eivald Glissan]] at <abbr title="Holy Quorum">[[HQ]]</abbr> regularly, keeping extensive notes to hand in to Hellenhelm, and being excited to meet [[Cardinal Maurul Silkendawn]]. Although he has listened patiently to [[Reiner Hoss]] outline his hatred of [[Kade Sirrine Kathedrale]] for its treatment of those who worship [[Mystra]], he remains steadfast in his resolve to protect the church, placing his trust in [[Sable Warden Meriele Berevan]] and her hatred of the undead to confide their findings to her, despite their suspicion that there might be insiders within the clergy. He tells Anrel that there are no grounds for him to assassinate Cardinal Silkendawn, no matter what cooperation it gets them from [[Leagallow Tiaathque]] in the short term.
Vichthart is also devoted to his goddess, Sarenrae, praying to her every morning. He has very occasionally received words of advice from her via his holy pendant, being told to swim when first falling in the cold waters off Meeresdorf, and recently being guided to put the [[Feywild Shard]] in the hands of Grokko. He was pleased to see Lania Falst wearing a pendant similar to his own after she recovered in Meeresdorf, and has been keenly watching Grokko's growing interest in the church, disappointed by how readily he's changed his attitude after speaking to members of the [[Knives of Mystra]]. Early on in his adventures in Scharn, he experienced a dream of his father, [[Father Decheimül Fezzilbahn]], in the form of an early lesson he received about the duality of Sarenrae, and the very real fight against evil being just as important as the protection and redemption of good people.
Vichthart's eagerness to serve the church, to purge the world of fiendish invaders, and protect his friends, can sometimes cause him to fight with reckless regard for his own well being. His use of his shield and mace, and tendency to try to grapple and pin his opponents, result in his ending up close to danger multiple times. When first attacking a goblin hideout near Meeresdorf, Vichthart neared death at the hands of the [[bugbear]] [[Tark]], receiving a permanent, sun-shaped scar on his chest. His acquisition of [[platinum ring]]s from [[faerie dragon]]s has encouraged him to take even more damage by regularly casting [[Warding Bond]] on Grokko. Fortunately, his discovery and wearing of the [[Periapt of Wound Closure]] has saved his life on every occasion, but falling unconscious so often has frequently left him unable to fight, to flee dangerous situations, or heal his friends when needed. While facing the Knives of Mystra underneath Kaarst, he needed to be administered a [[Potion of Healing]] twice by the [[Raven Guard]] nicknamed [[Black]].
Vichthart has twice been infected by disease, firstly taking a swipe from a gnoll that gave him an uncanny cackle, and later breathing in fungal spores from a [[false beholder]] beneath [[Squall's Beacon]]. In both cases, Vichthart brushed aside concerns for his wellbeing, and although his cackling subsided on its own, it was only when Anrel used his [[Lay On Hands]] that Vichthart coughed up the horrible clump that had been growing inside him that they realized how perilous his infection had been.
{{Characters}}
[[Category:Heroes]]
[[Category:Humans]]
[[Category:Clerics]]
[[Category:Members of Verein Kirche von Arkhelle]]
[[Category:Worshippers of Sarenrae]]
[[Category:Fezzilbahn family]]
[[Category:Characters played by Wil]]
0441325694cfc6dc5a2e8d366aef4dd89db4967d
Tyrant
0
315
552
2024-04-23T00:21:49Z
Vicht
1
Created page with "In the [[Timeline|Age of Decadence]], a <b>Tyrant</b> ruled [[Kaarst]] with the aid of his arcane followers. They wielded magic to enslave other arcane practitioners, and used that magic to raise a giant statue of the Tyrant to the clifftop above the city. The populace didn't take kindly to the cruelty and overthrew the Tyrant. His statue was collapsed into [[Kaarst Bay]] where only its hand reaches above the surface, coming to be known as [[Tyrant's Folly]]. Being from..."
wikitext
text/x-wiki
In the [[Timeline|Age of Decadence]], a <b>Tyrant</b> ruled [[Kaarst]] with the aid of his arcane followers. They wielded magic to enslave other arcane practitioners, and used that magic to raise a giant statue of the Tyrant to the clifftop above the city. The populace didn't take kindly to the cruelty and overthrew the Tyrant. His statue was collapsed into [[Kaarst Bay]] where only its hand reaches above the surface, coming to be known as [[Tyrant's Folly]]. Being from Kaarst, [[Anrel]] knew this story when the party originally arrived in the harbour, and [[Sable Warden Meriele Berevan]] recounted this story to [[Grokko]] when asked why arcane magic is illegal in Kaarst.
{{Characters}}
7d378212f238166ee82b89185b47951ec311b78d
Tyrant's Folly
0
316
553
2024-04-23T00:30:10Z
Vicht
1
Created page with "In the [[Timeline|Age of Decadence]], enslaved arcane practitioners were used to raise a statue of [[Kaarst]]'s Tyrant ruler to the clifftop above the city. When the populace overthrew the [[Tyrant]], his statue was collapsed into [[Kaarst Bay]] where only its hand reaches above the surface. Known now as <b>Tyrant's Folly</b>, the stone hand is still visible above the waterline, but has become very weatherbeaten. [[Anrel]] is aware of the hand's history when he returns t..."
wikitext
text/x-wiki
In the [[Timeline|Age of Decadence]], enslaved arcane practitioners were used to raise a statue of [[Kaarst]]'s Tyrant ruler to the clifftop above the city. When the populace overthrew the [[Tyrant]], his statue was collapsed into [[Kaarst Bay]] where only its hand reaches above the surface. Known now as <b>Tyrant's Folly</b>, the stone hand is still visible above the waterline, but has become very weatherbeaten. [[Anrel]] is aware of the hand's history when he returns to Kaarst with the rest of the party. [[Rewyn]] cites the height of the statue as evidence of Kaarst Bay's incredible depth when the party asks if the [[Tide]] can recover anything from the sunken <i class="ship">[[Hope's Prize]]</i>.
{{Locations}}
43b31861229d356b210b36985c9805ef4dcabb80
Notes:Fiend and dragon poem
100
317
554
2024-04-23T20:10:06Z
Vicht
1
Created page with "The covetous watches all Foes pitiless and eternal. Madness breeds in deepest night Plots and schemes smashed by wild might. Order marches in the sun The mindless quelled and overrun. Wars of blood and soul below Greed soars above—it waits to overthrow."
wikitext
text/x-wiki
The covetous watches all
Foes pitiless and eternal.
Madness breeds in deepest night
Plots and schemes smashed by wild might.
Order marches in the sun
The mindless quelled and overrun.
Wars of blood and soul below
Greed soars above—it waits to overthrow.
47252bb26044a59b84099ae6f67bcb223c7e0b81
555
554
2024-04-23T20:10:25Z
Vicht
1
Added line breaks
wikitext
text/x-wiki
The covetous watches all<br>
Foes pitiless and eternal.<br>
Madness breeds in deepest night<br>
Plots and schemes smashed by wild might.<br>
Order marches in the sun<br>
The mindless quelled and overrun.<br>
Wars of blood and soul below<br>
Greed soars above—it waits to overthrow.
98de92d291db26f29fc108f48bec0cf0097a84aa
567
555
2024-04-25T00:54:47Z
Vicht
1
Vicht moved page [[Note:Fiend and dragon poem]] to [[Notes:Fiend and dragon poem]] without leaving a redirect: Wrong namespace
wikitext
text/x-wiki
The covetous watches all<br>
Foes pitiless and eternal.<br>
Madness breeds in deepest night<br>
Plots and schemes smashed by wild might.<br>
Order marches in the sun<br>
The mindless quelled and overrun.<br>
Wars of blood and soul below<br>
Greed soars above—it waits to overthrow.
98de92d291db26f29fc108f48bec0cf0097a84aa
Beatrux
0
318
556
2024-04-23T22:22:04Z
Vicht
1
Created page with "A [[dwarf]] woman enslaved by [[gnoll]]s on the [[Zaheer island|island]] used by the gnolls to summon [[demon]]s. When the party infiltrates the latest intake of slaves, she tells them that she has been there the longest of all the survivors. She was brought to the island two months ago. Upon seeing a screaming and sobbing woman, a short, hooded gnoll orders her to be taken away, and she is dragged to a cave entrance to the south. <b>Beatrux</b> tells the party that the..."
wikitext
text/x-wiki
A [[dwarf]] woman enslaved by [[gnoll]]s on the [[Zaheer island|island]] used by the gnolls to summon [[demon]]s. When the party infiltrates the latest intake of slaves, she tells them that she has been there the longest of all the survivors. She was brought to the island two months ago.
Upon seeing a screaming and sobbing woman, a short, hooded gnoll orders her to be taken away, and she is dragged to a cave entrance to the south. <b>Beatrux</b> tells the party that the short gnoll is called [[Rrekkeh]], and that no one that he's taken into the caves has ever come back.
{{Characters}}
[[Category:Dwarves]]
[[Category:Slaves of the gnolls]]
6c769b3c1f469e200377ce9eed84d48caf17df82
Celia
0
319
557
2024-04-23T22:58:42Z
Vicht
1
Created page with "A woman enslaved by [[gnoll]]s on the [[Zaheer island|island]] used by the gnolls to summon [[demon]]s. She was held in a cell inside the mountain temple, presumably to be used as a sacrifice in the near future, until she was freed by the party. From the temple atrium, taking three consecutive northwestern doors lead into a gaol with four cells, each containing two humanoids. Most of them were [[human]], but one was an older-looking [[halfling]] and another was a dwar..."
wikitext
text/x-wiki
A woman enslaved by [[gnoll]]s on the [[Zaheer island|island]] used by the gnolls to summon [[demon]]s. She was held in a cell inside the mountain temple, presumably to be used as a sacrifice in the near future, until she was freed by the party.
From the temple atrium, taking three consecutive northwestern doors lead into a gaol with four cells, each containing two humanoids. Most of them were [[human]], but one was an older-looking [[halfling]] and another was a [[dwarf]]. One of the captives introduced herself as <b>Celia</b>. Shortly after, another captive called [[Preston]] recognized [[Vichthart]].
After the party killed [[Srir Silthallow]], and [[Rrekkeh Stormcrawler]] escaped, the party freed these slaves and returned them to the mainland aboard <i class="ship">[[Dancing in the Storm]]</i>.
{{Characters}}
[[Category:Slaves of the gnolls]]
b4b31033fe3b886704da86f20124775b6b153c55
Preston
0
320
558
2024-04-23T23:03:55Z
Vicht
1
Created page with "A man enslaved by [[gnoll]]s on the [[Zaheer island|island]] used by the gnolls to summon [[demon]]s. He was held in a cell inside the mountain temple, presumably to be used as a sacrifice in the near future, until he was freed by the party. From the temple atrium, taking three consecutive northwestern doors lead into a gaol with four cells, each containing two humanoids. Most of them were [[human]], but one was an older-looking [[halfling]] and another was a [[dwarf]]...."
wikitext
text/x-wiki
A man enslaved by [[gnoll]]s on the [[Zaheer island|island]] used by the gnolls to summon [[demon]]s. He was held in a cell inside the mountain temple, presumably to be used as a sacrifice in the near future, until he was freed by the party.
From the temple atrium, taking three consecutive northwestern doors lead into a gaol with four cells, each containing two humanoids. Most of them were [[human]], but one was an older-looking [[halfling]] and another was a [[dwarf]]. After one of the captives introduced herself as <b>Celia</b>, another captive called <b>Preston</b> recognized [[Vichthart]] as saving his life after the sinking of <i class="ship">[[The Crested Eagle]]</i>.
After the party killed [[Srir Silthallow]], and [[Rrekkeh Stormcrawler]] escaped, the party freed these slaves and returned them to the mainland aboard <i class="ship">[[Dancing in the Storm]]</i>.
{{Characters}}
[[Category:Slaves of the gnolls]]
[[Category:Crew of The Crested Eagle]]
6fb10e3ccbc66cfb20fdb32b52ba18870d9e3926
Maghn Ünthergol
0
314
559
549
2024-04-23T23:06:57Z
Vicht
1
Removed Category:Missing persons
wikitext
text/x-wiki
Seven years before he returned to [[Kaarst]], [[Anrel]] had led a platoon to [[Ùrlar Valley]] in the [[Fuarcrùn Freeholds]]. Anrel himself blacked out and woke up elsewhere, believing all who'd served under him were now dead.
When the party met with [[Orianna]] on [[Timeline|19 Thelliea]], Anrel gave a list of his soldiers to Orianna and asked if the [[Tide]] could try to locate any of the individuals. He prevented [[Mira]] from looking at the list, but Mira did manage to see the name <b>Maghn Ünthergol</b>.
[[Category:Soldiers in Anrel's platoon]]
be86d02e5ccce5200517da7aa0a8da381598cf12
Category:Soldiers in Anrel's platoon
14
321
560
2024-04-23T23:07:14Z
Vicht
1
Added Category:Missing persons
wikitext
text/x-wiki
[[Category:Missing persons]]
db150c98ca0af3a8d166cda111ae1147cd3592b2
Ingen Persson
0
322
561
2024-04-24T00:29:56Z
Vicht
1
Created page with "Seven years before he returned to [[Kaarst]], [[Anrel]] had led a platoon to [[Ùrlar Valley]] in the [[Fuarcrùn Freeholds]]. Anrel himself blacked out and woke up elsewhere, believing all who'd served under him were now dead. <b>Cadet Ingen Persson</b> was one of these soldiers. In the caves on the [[Zaheer island|island]] used by [[gnoll]]s to summon [[demon]]s, the party wandered into a chamber filled the bones of people who died violently, presumably those killed b..."
wikitext
text/x-wiki
Seven years before he returned to [[Kaarst]], [[Anrel]] had led a platoon to [[Ùrlar Valley]] in the [[Fuarcrùn Freeholds]]. Anrel himself blacked out and woke up elsewhere, believing all who'd served under him were now dead. <b>Cadet Ingen Persson</b> was one of these soldiers.
In the caves on the [[Zaheer island|island]] used by [[gnoll]]s to summon [[demon]]s, the party wandered into a chamber filled the bones of people who died violently, presumably those killed by the wolf demon. [[Anrel]] found a [[Ingen's satchel|satchel]] that he recognized as having been Ingen's, and inside it found items that he also recognized as belonging to him: a [[Ingen's journal|leatherbound journal]], a [[Ingen's thieves' tools|set of thieves' tools]], and a [[Ingen's invisibility potion|vial of nearly transparent liquid]], all of which Anrel picked up. The journal was written in a draconic language that Anrel couldn't get translated on the journey to [[Kaarst]] because it was written in some kind of cypher.
When [[Cardinal Maurul Silkendawn]] confronted [[Anrel]] in the [[house of healing]] on [[Timeline|18 Thelliea]], Anrel showed the Cardinal the items that belonged to Ingen. He implied that Ingen's name was written in the journal. Upon examining the journal, Silkendawn noted that it was written in a cypher, which matched Cadet Persson's secretive personality.
When the party met with [[Orianna]] on 19 Thelliea, Anrel gave a list of his soldiers to Orianna and asked if the [[Tide]] could try to locate any of the individuals. He prevented [[Mira]] from looking at the list, but it presumably would have included Ingen.
According to [[Traggey]], ‘Ingen Persson’ is Swedish for ‘nobody’, and he found it funny that this was the name [[Manco]] chose to use for the discovered satchel.
[[Category:Soldiers in Anrel's platoon]]
9fcf39e48a83996174e25a307801068b1da714a8
Notes:Kobolwitz prescription
100
323
562
2024-04-24T23:45:03Z
Vicht
1
Created page with "Reginald, You should find that this medicine will alleviate the joint pain you have described. Take one tablet per day, ideally in the evening before bed. I have provided an initial supply for one (1) month; when you are running low, please do not hesitate to contact us and I will be happy to prepare a further supply for you. Your friend,<br> Leagallow Tiaathque<br> Tiaathque’s Medicinal Remedies"
wikitext
text/x-wiki
Reginald,
You should find that this medicine will alleviate the joint pain you have described. Take one tablet per day, ideally in the evening before bed.
I have provided an initial supply for one (1) month; when you are running low, please do not hesitate to contact us and I will be happy to prepare a further supply for you.
Your friend,<br>
Leagallow Tiaathque<br>
Tiaathque’s Medicinal Remedies
6c026abefbe5ada4e10b3b0117823370526bcf8c
568
562
2024-04-25T00:55:00Z
Vicht
1
Vicht moved page [[Note:Kobolwitz prescription]] to [[Notes:Kobolwitz prescription]] without leaving a redirect
wikitext
text/x-wiki
Reginald,
You should find that this medicine will alleviate the joint pain you have described. Take one tablet per day, ideally in the evening before bed.
I have provided an initial supply for one (1) month; when you are running low, please do not hesitate to contact us and I will be happy to prepare a further supply for you.
Your friend,<br>
Leagallow Tiaathque<br>
Tiaathque’s Medicinal Remedies
6c026abefbe5ada4e10b3b0117823370526bcf8c
Notes:C.B.L. invoice
100
324
563
2024-04-24T23:46:17Z
Vicht
1
Created page with "Ser Kobolwitz, I wish to thank you again for selecting ourselves for such a fine commission, I hope that it serves you well. I have calibrated the combination as you requested:<br> R2C6R3C6<br> R5C1R10C9<br> R4C3R7C7 I would recommend retaining this letter in case you should require to consult it in future. Kind regards and best wishes,<br> C.B.L."
wikitext
text/x-wiki
Ser Kobolwitz,
I wish to thank you again for selecting ourselves for such a fine commission, I hope that it serves you well.
I have calibrated the combination as you requested:<br>
R2C6R3C6<br>
R5C1R10C9<br>
R4C3R7C7
I would recommend retaining this letter in case you should require to consult it in future.
Kind regards and best wishes,<br>
C.B.L.
557614687c13ee4ab8679cb0a85a499d44322760
566
563
2024-04-25T00:54:20Z
Vicht
1
Vicht moved page [[Note:C.B.L. invoice]] to [[Notes:C.B.L. invoice]] without leaving a redirect: Wrong namespace
wikitext
text/x-wiki
Ser Kobolwitz,
I wish to thank you again for selecting ourselves for such a fine commission, I hope that it serves you well.
I have calibrated the combination as you requested:<br>
R2C6R3C6<br>
R5C1R10C9<br>
R4C3R7C7
I would recommend retaining this letter in case you should require to consult it in future.
Kind regards and best wishes,<br>
C.B.L.
557614687c13ee4ab8679cb0a85a499d44322760
Timeline
0
5
564
485
2024-04-25T00:27:30Z
Vicht
1
Added Leagallow Tiaathque's claim of not having recently met Ser Reginald Kobolwitz
wikitext
text/x-wiki
There have been eight Ages, although none among the party can remember the numbering of them. The current year is 1853 Post-Accord (or P.A.).
== Ancient history ==
; Age of Great Ruin
: The soul of a Great Wyrm from this time comes to held in the [[Dragon Orb of Drimysthonontas]].
; Age of Enlightenment
: [[Squall's Beacon]] is constructed, possibly in [[Farankaars]].
: [[Kereskaa]] contains the Dragon Orb of Drimysthonontas. The [[Acropolis of Kereskaa]] is built on top of it.
: A servant of [[Corellon]] gifts a [[feywild tree|tree from the Feywild]] to the Acropolis of Kereskaa for ‘a good deed done’.
: [[Suithrathus Luirmo]] begins his tenure at Acropolis of Kereskaa
: Veteran of the [[Blood Wars]], [[Vastren]] is summoned into the catacomb beneath the [[Spire of Conjuration]] by [[Cansa Cinsmic]]. Vastren describes her as ‘Lost, blind, and running out of time.’
: 576th year of the Age of Enlightenment, approximately 1150 years before the [[Divine Accord]]. [[Teklanna Morantine]] betrays the Acropolis of Kereskaa to the [[Kythera]]ns, who destroy the Acropolis. Suithrathus Luirmo transfers himself to his divining mirror to stay alive. [[Toross Rhistel]] becomes trapped in his mirror device, where he later perishes. [[Elgrex Anderra]] is kept safe in the [[Spire of Abjuration]]. Most of the other Masters and students die in the attack. After three days, Elgrex records a holographic message to her unknown lover, saying she will try to find survivors and travel to [[Geat-Mea]], but her [[Seal]] is eventually found—presumably within the Acropolis—by [[Etorn Hadaran]], suggesting she never escaped. Teklanna Morantine steals the Dragon Orb of Drimysthonontas from the vault.
; Age of Decadence
: A [[Tyrant]] rules [[Kaarst]] with his aid of his arcane followers. The wield magic to enslave other arcane practitioners, and use that magic to raise a giant statue of the Tyrant to the clifftop above the city. The populace does not take kindly to the cruelty and overthrow the Tyrant. His statue is collapsed into [[Kaarst Bay]] where only its hand reaches above the surface, coming to be known as [[Tyrant's Folly]].
; [[Great War]]
: Lasting several hundred years, many souls were lost. Much of the destruction was performed by mages. Flying cities like [[Kythera]] were used as weapons.
: The [[Divine Accord]] ends the Great War. The gods of good and evil agree not to visit the [[Material Plane]]. The Divine Accord is signed by [[Bahamut]] and [[Teli Monei]] at a summit later depicted by a sculpture in [[Kade Sirrine Kathedrale]].
; A little over 500 years ago
: The most recent appearance of the comet [[Ashtkaan]] in the skies above [[Talyen]].
== Recent history==
All years are approximations based on ages (known and apparent) and statements liable to inaccuracy and rounding.
; Approximately 3 generations ago
: The founding of the [[Arkhellen Empire]]. 12 churches are united as [[Verein Kirche von Arkhelle]], although a compromise is made to allow [[Kaarst]] to keep its laws against practising arcane magic.
; 1764–1773
: Birth of [[Maurul Silkendawn]], who now appears to be in his eighties.
; 1794–1798
: Birth of [[Reginald Kobolwitz]], who was in his late fifties when he died.
; 1806
: Birth of [[Traulam Eugen]], who is now 47.
; 1818
: Birth of [[Lorenzo Arkhelle]], who is now 35.
; 1841
: [[King Lorenzo Friedriche Arkhelle XVI]] becomes 3rd Emperor of the Arkhellen Empire.
; 1843
: [[Anrel Salier]] is living in [[Kaarst]] having been raised by the church there.
; 1844
: [[Mirark]]'s tiefling friend disappears
; 1845
: [[Amnon Ingolidan]] begins working at [[Squall's Beacon]].
: [[Ruda]] and [[Felosiel Teinithra]] marry.
; 1846
: [[Anrel Salier]] leads his platoon into [[Ùrlar Valley]] to investigate a strange excavation. He loses consciousness and wakes up far away. He believes is the only survivor and does not return to Kaarst.
; 1846–1847
: [[Felosiel Teinithra]] becomes captain of [[Kaarst City Watch]].
; 1848
: [[Kham Gohlrim]] is the only person still speaking to [[Elira Lein]].
; 1850
: [[Armine Detlef]] discovers [[Arnt]] on the streets of [[Kaarst]].
: [[Eurgaran Wihta]] begins working at [[Squall's Beacon]].
: [[Orryn Daergel]] is promoted from Private to Sergeant in [[Kaarst City Watch]].
; 1851
: [[Ruda]] and [[Felosiel Teinithra]] move to their current home in the [[Lamp Ward]].
== 1853 Post-Accord ==
; Seanchai
: [[Kham Gohlrim]] departs his post and disappears. [[Cardinal Maurul Silkendawn]] assumes he has gone to find [[Anrel Salier]].
; Coreivae/Skaerensta
: [[Leagallow Tiaathque]] alleges he hadn't met with [[Ser Reginald Kobolwitz]] since a couple of months before his death
; 25 Skaerentsa
: [[Captain Adran Mokam]] and boatswain [[Thava Windreaver]] are found dead on the lower deck of <i class="ship">[[Hope's Prize]]</i> by the ship's crew while docked in [[Kaarst]].
; Late Skaerensta
: [[Beatrux]] is brought to the [[Zaheer island]] as a slave by [[gnoll]]s.
; 12 Maneseed
: [[Claira Hanali]] visits family in [[Salzreich]], three weeks before returning to work at [[Kobolwitz Manor]].
; Early Maneseed
: [[Valiant Morgen Trading Company]] purchases a [[Valiant Morgen Trading Company warehouse|warehouse]] in Kaarst.
; 19 Maneseed
: [[Father Traulam Eugen]] attempts to meet the [[Tide]] in Kaarst but is ambushed and taken for questioning by the [[Knives of Mystra]].
; 20 Maneseed
: Officials from [[Kade Sirrine Kathedrale]] contact [[Karst City Watch]] to let them know that Father Traulam Eugen did not return to his quarters as expected.
; 3 Thirkuoss
: Claira Hanali discovers Ser Reginald Kobolwitz dead in his drawing room, having been killed by a [[vampire]] several days earlier.
; 9 Thirkuoss
: [[Thodris Holderhek]] is likely killed in the evening while working in the [[Sombre Lyceum]].
; 10 Thirkuoss
: Thodris Holderhek's body is found in the Sombre Lyceum by mourners in the early morning.
: [[Anrel Salier]] cuts off [[Armine Detlef]]'s arm.
; 15 Thirkuoss
: [[Eurgaran Wihta]] leaves home in the evening but does not arrive at [[Squall's Beacon]]. It is likely he is ambushed by [[Eldon Garrick]] and taken to his torture chamber underneath the lighthouse.
; 16 Thirkuoss
: [[Heda Wihta]] reports her husband missing to Kaarst City Watch in the early morning.
; 17 Thirkuoss
: [[Eurgaran Wihta]]'s body is found floating in the harbour by a group of dockworkers early in the morning.
; 25 Thirkuoss
: Party arrives at [[gnoll]] camp in [[Aleph Marsh]]
; 26 Thirkuoss
: Slaves are freed from [[gnoll]] camp and sail to [[Meeresdorf]]
; 27 Thirkuoss
: Party arrives on the [[Zaheer island|island]] and escapes the slave camp
; 28 Thirkuoss
: Party meets ghosts and [[troglodyte|lizard-type folk]] in the [[Zaheer island|island]] caves
; 29 Thirkuoss
: [[Srir Silthallow]] is defeated but [[Rrekkeh Stormcrawler]] escapes
; 30 Thirkuoss
: Survivors leave the [[Zaheer island|island]] aboard <i class="ship">[[Dancing in the Storm]]</i>
; 31 Thirkuoss
: <i class="ship">[[Dancing in the Storm]]</i> departs [[Meeresdorf]] for [[Senneborn]]
; 1 Thelliea
: <i class="ship">[[Dancing in the Storm]]</i> arrives in [[Senneborn]]; Party departs for [[Kaarst]]
; 3 Thelliea
: [[Captain Felosial Teinithra]] and [[Sergeant Therai Doudra]] patrol narrow side streets of [[Ravensfair]] late at night. Sgt Doudra is knocked unconscious, Cpt Teinithra is abducted by the [[Knives of Mystra]].
; 4 Thelliea
: Sergeant Therai Doudra reports her assault to Kaarst City Watch.
; 11 Thelliea
: Party arrives in [[Kaarst]], visits [[Kade Sirrine Kathedrale]], [[Mira]] joins
; 12 Thelliea
: Party visits [[Kobolwitz Manor]] and [[Squall's Beacon]]
; 13 Thelliea
: Discovery and stakeout of [[Valiant Morgen warehouse]], [[Ashmaker]] attacks
; 14 Thelliea
: Interrogation of captives, jailbreak of [[Uthan]], meeting [[the Tide]], investigating [[Valiant Morgen Trading Company|Valiant Morgen]]
; 15 Thelliea
: [[Sable Warden]] sends party to [[Acropolis of Karaskaa]], party stops [[Knives of Mystra]] just before sunset, planned meeting of [[Kaarst City Council]] is abandoned
; 16 Thelliea
: <i class="ship">[[Hope's Prize]]</i> was due to depart [[Kaarst]]
; 18 Thelliea
: [[Anrel]] awakes in the [[house of healing]] near [[Kade Sirrine Kathedrale]].
; 19 Thelliea
: The [[Galesong Thervan Indále|Galesong]] and [[Sable Warden Meriele Berevan|Sable Warden]] have a final debrief with the heroes of [[Kaarst]]
826df29421c9b574a3cac75b8bd4d5966090a902
565
564
2024-04-25T00:45:44Z
Vicht
1
Added birth of Ruda
wikitext
text/x-wiki
There have been eight Ages, although none among the party can remember the numbering of them. The current year is 1853 Post-Accord (or P.A.).
== Ancient history ==
; Age of Great Ruin
: The soul of a Great Wyrm from this time comes to held in the [[Dragon Orb of Drimysthonontas]].
; Age of Enlightenment
: [[Squall's Beacon]] is constructed, possibly in [[Farankaars]].
: [[Kereskaa]] contains the Dragon Orb of Drimysthonontas. The [[Acropolis of Kereskaa]] is built on top of it.
: A servant of [[Corellon]] gifts a [[feywild tree|tree from the Feywild]] to the Acropolis of Kereskaa for ‘a good deed done’.
: [[Suithrathus Luirmo]] begins his tenure at Acropolis of Kereskaa
: Veteran of the [[Blood Wars]], [[Vastren]] is summoned into the catacomb beneath the [[Spire of Conjuration]] by [[Cansa Cinsmic]]. Vastren describes her as ‘Lost, blind, and running out of time.’
: 576th year of the Age of Enlightenment, approximately 1150 years before the [[Divine Accord]]. [[Teklanna Morantine]] betrays the Acropolis of Kereskaa to the [[Kythera]]ns, who destroy the Acropolis. Suithrathus Luirmo transfers himself to his divining mirror to stay alive. [[Toross Rhistel]] becomes trapped in his mirror device, where he later perishes. [[Elgrex Anderra]] is kept safe in the [[Spire of Abjuration]]. Most of the other Masters and students die in the attack. After three days, Elgrex records a holographic message to her unknown lover, saying she will try to find survivors and travel to [[Geat-Mea]], but her [[Seal]] is eventually found—presumably within the Acropolis—by [[Etorn Hadaran]], suggesting she never escaped. Teklanna Morantine steals the Dragon Orb of Drimysthonontas from the vault.
; Age of Decadence
: A [[Tyrant]] rules [[Kaarst]] with his aid of his arcane followers. The wield magic to enslave other arcane practitioners, and use that magic to raise a giant statue of the Tyrant to the clifftop above the city. The populace does not take kindly to the cruelty and overthrow the Tyrant. His statue is collapsed into [[Kaarst Bay]] where only its hand reaches above the surface, coming to be known as [[Tyrant's Folly]].
; [[Great War]]
: Lasting several hundred years, many souls were lost. Much of the destruction was performed by mages. Flying cities like [[Kythera]] were used as weapons.
: The [[Divine Accord]] ends the Great War. The gods of good and evil agree not to visit the [[Material Plane]]. The Divine Accord is signed by [[Bahamut]] and [[Teli Monei]] at a summit later depicted by a sculpture in [[Kade Sirrine Kathedrale]].
; A little over 500 years ago
: The most recent appearance of the comet [[Ashtkaan]] in the skies above [[Talyen]].
== Recent history==
All years are approximations based on ages (known and apparent) and statements liable to inaccuracy and rounding.
; Approximately 3 generations ago
: The founding of the [[Arkhellen Empire]]. 12 churches are united as [[Verein Kirche von Arkhelle]], although a compromise is made to allow [[Kaarst]] to keep its laws against practising arcane magic.
; 1764–1773
: Birth of [[Maurul Silkendawn]], who now appears to be in his eighties.
; 1794–1798
: Birth of [[Reginald Kobolwitz]], who was in his late fifties when he died.
; 1806
: Birth of [[Traulam Eugen]], who is now 47.
; 1816–1820
: Birth of [[Ruda]], who is now in his mid-thirties.
; 1818
: Birth of [[Lorenzo Arkhelle]], who is now 35.
; 1841
: [[King Lorenzo Friedriche Arkhelle XVI]] becomes 3rd Emperor of the Arkhellen Empire.
; 1843
: [[Anrel Salier]] is living in [[Kaarst]] having been raised by the church there.
; 1844
: [[Mirark]]'s tiefling friend disappears
; 1845
: [[Amnon Ingolidan]] begins working at [[Squall's Beacon]].
: Ruda and [[Felosiel Teinithra]] marry.
; 1846
: [[Anrel Salier]] leads his platoon into [[Ùrlar Valley]] to investigate a strange excavation. He loses consciousness and wakes up far away. He believes is the only survivor and does not return to Kaarst.
; 1846–1847
: [[Felosiel Teinithra]] becomes captain of [[Kaarst City Watch]].
; 1848
: [[Kham Gohlrim]] is the only person still speaking to [[Elira Lein]].
; 1850
: [[Armine Detlef]] discovers [[Arnt]] on the streets of [[Kaarst]].
: [[Eurgaran Wihta]] begins working at [[Squall's Beacon]].
: [[Orryn Daergel]] is promoted from Private to Sergeant in [[Kaarst City Watch]].
; 1851
: [[Ruda]] and [[Felosiel Teinithra]] move to their current home in the [[Lamp Ward]].
== 1853 Post-Accord ==
; Seanchai
: [[Kham Gohlrim]] departs his post and disappears. [[Cardinal Maurul Silkendawn]] assumes he has gone to find [[Anrel Salier]].
; Coreivae/Skaerensta
: [[Leagallow Tiaathque]] alleges he hadn't met with [[Ser Reginald Kobolwitz]] since a couple of months before his death
; 25 Skaerentsa
: [[Captain Adran Mokam]] and boatswain [[Thava Windreaver]] are found dead on the lower deck of <i class="ship">[[Hope's Prize]]</i> by the ship's crew while docked in [[Kaarst]].
; Late Skaerensta
: [[Beatrux]] is brought to the [[Zaheer island]] as a slave by [[gnoll]]s.
; 12 Maneseed
: [[Claira Hanali]] visits family in [[Salzreich]], three weeks before returning to work at [[Kobolwitz Manor]].
; Early Maneseed
: [[Valiant Morgen Trading Company]] purchases a [[Valiant Morgen Trading Company warehouse|warehouse]] in Kaarst.
; 19 Maneseed
: [[Father Traulam Eugen]] attempts to meet the [[Tide]] in Kaarst but is ambushed and taken for questioning by the [[Knives of Mystra]].
; 20 Maneseed
: Officials from [[Kade Sirrine Kathedrale]] contact [[Karst City Watch]] to let them know that Father Traulam Eugen did not return to his quarters as expected.
; 3 Thirkuoss
: Claira Hanali discovers Ser Reginald Kobolwitz dead in his drawing room, having been killed by a [[vampire]] several days earlier.
; 9 Thirkuoss
: [[Thodris Holderhek]] is likely killed in the evening while working in the [[Sombre Lyceum]].
; 10 Thirkuoss
: Thodris Holderhek's body is found in the Sombre Lyceum by mourners in the early morning.
: [[Anrel Salier]] cuts off [[Armine Detlef]]'s arm.
; 15 Thirkuoss
: [[Eurgaran Wihta]] leaves home in the evening but does not arrive at [[Squall's Beacon]]. It is likely he is ambushed by [[Eldon Garrick]] and taken to his torture chamber underneath the lighthouse.
; 16 Thirkuoss
: [[Heda Wihta]] reports her husband missing to Kaarst City Watch in the early morning.
; 17 Thirkuoss
: [[Eurgaran Wihta]]'s body is found floating in the harbour by a group of dockworkers early in the morning.
; 25 Thirkuoss
: Party arrives at [[gnoll]] camp in [[Aleph Marsh]]
; 26 Thirkuoss
: Slaves are freed from [[gnoll]] camp and sail to [[Meeresdorf]]
; 27 Thirkuoss
: Party arrives on the [[Zaheer island|island]] and escapes the slave camp
; 28 Thirkuoss
: Party meets ghosts and [[troglodyte|lizard-type folk]] in the [[Zaheer island|island]] caves
; 29 Thirkuoss
: [[Srir Silthallow]] is defeated but [[Rrekkeh Stormcrawler]] escapes
; 30 Thirkuoss
: Survivors leave the [[Zaheer island|island]] aboard <i class="ship">[[Dancing in the Storm]]</i>
; 31 Thirkuoss
: <i class="ship">[[Dancing in the Storm]]</i> departs [[Meeresdorf]] for [[Senneborn]]
; 1 Thelliea
: <i class="ship">[[Dancing in the Storm]]</i> arrives in [[Senneborn]]; Party departs for [[Kaarst]]
; 3 Thelliea
: [[Captain Felosial Teinithra]] and [[Sergeant Therai Doudra]] patrol narrow side streets of [[Ravensfair]] late at night. Sgt Doudra is knocked unconscious, Cpt Teinithra is abducted by the [[Knives of Mystra]].
; 4 Thelliea
: Sergeant Therai Doudra reports her assault to Kaarst City Watch.
; 11 Thelliea
: Party arrives in [[Kaarst]], visits [[Kade Sirrine Kathedrale]], [[Mira]] joins
; 12 Thelliea
: Party visits [[Kobolwitz Manor]] and [[Squall's Beacon]]
; 13 Thelliea
: Discovery and stakeout of [[Valiant Morgen warehouse]], [[Ashmaker]] attacks
; 14 Thelliea
: Interrogation of captives, jailbreak of [[Uthan]], meeting [[the Tide]], investigating [[Valiant Morgen Trading Company|Valiant Morgen]]
; 15 Thelliea
: [[Sable Warden]] sends party to [[Acropolis of Karaskaa]], party stops [[Knives of Mystra]] just before sunset, planned meeting of [[Kaarst City Council]] is abandoned
; 16 Thelliea
: <i class="ship">[[Hope's Prize]]</i> was due to depart [[Kaarst]]
; 18 Thelliea
: [[Anrel]] awakes in the [[house of healing]] near [[Kade Sirrine Kathedrale]].
; 19 Thelliea
: The [[Galesong Thervan Indále|Galesong]] and [[Sable Warden Meriele Berevan|Sable Warden]] have a final debrief with the heroes of [[Kaarst]]
7476aec8c85c11a0e6e54dc19eb95a7ad95f5b29
569
565
2024-04-25T14:44:50Z
Vicht
1
Added birth of Irann Rhogar
wikitext
text/x-wiki
There have been eight Ages, although none among the party can remember the numbering of them. The current year is 1853 Post-Accord (or P.A.).
== Ancient history ==
; Age of Great Ruin
: The soul of a Great Wyrm from this time comes to held in the [[Dragon Orb of Drimysthonontas]].
; Age of Enlightenment
: [[Squall's Beacon]] is constructed, possibly in [[Farankaars]].
: [[Kereskaa]] contains the Dragon Orb of Drimysthonontas. The [[Acropolis of Kereskaa]] is built on top of it.
: A servant of [[Corellon]] gifts a [[feywild tree|tree from the Feywild]] to the Acropolis of Kereskaa for ‘a good deed done’.
: [[Suithrathus Luirmo]] begins his tenure at Acropolis of Kereskaa
: Veteran of the [[Blood Wars]], [[Vastren]] is summoned into the catacomb beneath the [[Spire of Conjuration]] by [[Cansa Cinsmic]]. Vastren describes her as ‘Lost, blind, and running out of time.’
: 576th year of the Age of Enlightenment, approximately 1150 years before the [[Divine Accord]]. [[Teklanna Morantine]] betrays the Acropolis of Kereskaa to the [[Kythera]]ns, who destroy the Acropolis. Suithrathus Luirmo transfers himself to his divining mirror to stay alive. [[Toross Rhistel]] becomes trapped in his mirror device, where he later perishes. [[Elgrex Anderra]] is kept safe in the [[Spire of Abjuration]]. Most of the other Masters and students die in the attack. After three days, Elgrex records a holographic message to her unknown lover, saying she will try to find survivors and travel to [[Geat-Mea]], but her [[Seal]] is eventually found—presumably within the Acropolis—by [[Etorn Hadaran]], suggesting she never escaped. Teklanna Morantine steals the Dragon Orb of Drimysthonontas from the vault.
; Age of Decadence
: A [[Tyrant]] rules [[Kaarst]] with his aid of his arcane followers. The wield magic to enslave other arcane practitioners, and use that magic to raise a giant statue of the Tyrant to the clifftop above the city. The populace does not take kindly to the cruelty and overthrow the Tyrant. His statue is collapsed into [[Kaarst Bay]] where only its hand reaches above the surface, coming to be known as [[Tyrant's Folly]].
; [[Great War]]
: Lasting several hundred years, many souls were lost. Much of the destruction was performed by mages. Flying cities like [[Kythera]] were used as weapons.
: The [[Divine Accord]] ends the Great War. The gods of good and evil agree not to visit the [[Material Plane]]. The Divine Accord is signed by [[Bahamut]] and [[Teli Monei]] at a summit later depicted by a sculpture in [[Kade Sirrine Kathedrale]].
; A little over 500 years ago
: The most recent appearance of the comet [[Ashtkaan]] in the skies above [[Talyen]].
== Recent history==
All years are approximations based on ages (known and apparent) and statements liable to inaccuracy and rounding.
; Approximately 3 generations ago
: The founding of the [[Arkhellen Empire]]. 12 churches are united as [[Verein Kirche von Arkhelle]], although a compromise is made to allow [[Kaarst]] to keep its laws against practising arcane magic.
; 1764–1773
: Birth of [[Maurul Silkendawn]], who now appears to be in his eighties.
; 1794–1798
: Birth of [[Reginald Kobolwitz]], who was in his late fifties when he died.
; 1794–1803
: Birth of [[Irann Rhogar]], who now appears to be in his fifties.
; 1806
: Birth of [[Traulam Eugen]], who is now 47.
; 1816–1820
: Birth of [[Ruda]], who is now in his mid-thirties.
; 1818
: Birth of [[Lorenzo Arkhelle]], who is now 35.
; 1841
: [[King Lorenzo Friedriche Arkhelle XVI]] becomes 3rd Emperor of the Arkhellen Empire.
; 1843
: [[Anrel Salier]] is living in [[Kaarst]] having been raised by the church there.
; 1844
: [[Mirark]]'s tiefling friend disappears
; 1845
: [[Amnon Ingolidan]] begins working at [[Squall's Beacon]].
: Ruda and [[Felosiel Teinithra]] marry.
; 1846
: [[Anrel Salier]] leads his platoon into [[Ùrlar Valley]] to investigate a strange excavation. He loses consciousness and wakes up far away. He believes is the only survivor and does not return to Kaarst.
; 1846–1847
: [[Felosiel Teinithra]] becomes captain of [[Kaarst City Watch]].
; 1848
: [[Kham Gohlrim]] is the only person still speaking to [[Elira Lein]].
; 1850
: [[Armine Detlef]] discovers [[Arnt]] on the streets of [[Kaarst]].
: [[Eurgaran Wihta]] begins working at [[Squall's Beacon]].
: [[Orryn Daergel]] is promoted from Private to Sergeant in [[Kaarst City Watch]].
; 1851
: [[Ruda]] and [[Felosiel Teinithra]] move to their current home in the [[Lamp Ward]].
== 1853 Post-Accord ==
; Seanchai
: [[Kham Gohlrim]] departs his post and disappears. [[Cardinal Maurul Silkendawn]] assumes he has gone to find [[Anrel Salier]].
; Coreivae/Skaerensta
: [[Leagallow Tiaathque]] alleges he hadn't met with [[Ser Reginald Kobolwitz]] since a couple of months before his death
; 25 Skaerentsa
: [[Captain Adran Mokam]] and boatswain [[Thava Windreaver]] are found dead on the lower deck of <i class="ship">[[Hope's Prize]]</i> by the ship's crew while docked in [[Kaarst]].
; Late Skaerensta
: [[Beatrux]] is brought to the [[Zaheer island]] as a slave by [[gnoll]]s.
; 12 Maneseed
: [[Claira Hanali]] visits family in [[Salzreich]], three weeks before returning to work at [[Kobolwitz Manor]].
; Early Maneseed
: [[Valiant Morgen Trading Company]] purchases a [[Valiant Morgen Trading Company warehouse|warehouse]] in Kaarst.
; 19 Maneseed
: [[Father Traulam Eugen]] attempts to meet the [[Tide]] in Kaarst but is ambushed and taken for questioning by the [[Knives of Mystra]].
; 20 Maneseed
: Officials from [[Kade Sirrine Kathedrale]] contact [[Karst City Watch]] to let them know that Father Traulam Eugen did not return to his quarters as expected.
; 3 Thirkuoss
: Claira Hanali discovers Ser Reginald Kobolwitz dead in his drawing room, having been killed by a [[vampire]] several days earlier.
; 9 Thirkuoss
: [[Thodris Holderhek]] is likely killed in the evening while working in the [[Sombre Lyceum]].
; 10 Thirkuoss
: Thodris Holderhek's body is found in the Sombre Lyceum by mourners in the early morning.
: [[Anrel Salier]] cuts off [[Armine Detlef]]'s arm.
; 15 Thirkuoss
: [[Eurgaran Wihta]] leaves home in the evening but does not arrive at [[Squall's Beacon]]. It is likely he is ambushed by [[Eldon Garrick]] and taken to his torture chamber underneath the lighthouse.
; 16 Thirkuoss
: [[Heda Wihta]] reports her husband missing to Kaarst City Watch in the early morning.
; 17 Thirkuoss
: [[Eurgaran Wihta]]'s body is found floating in the harbour by a group of dockworkers early in the morning.
; 25 Thirkuoss
: Party arrives at [[gnoll]] camp in [[Aleph Marsh]]
; 26 Thirkuoss
: Slaves are freed from [[gnoll]] camp and sail to [[Meeresdorf]]
; 27 Thirkuoss
: Party arrives on the [[Zaheer island|island]] and escapes the slave camp
; 28 Thirkuoss
: Party meets ghosts and [[troglodyte|lizard-type folk]] in the [[Zaheer island|island]] caves
; 29 Thirkuoss
: [[Srir Silthallow]] is defeated but [[Rrekkeh Stormcrawler]] escapes
; 30 Thirkuoss
: Survivors leave the [[Zaheer island|island]] aboard <i class="ship">[[Dancing in the Storm]]</i>
; 31 Thirkuoss
: <i class="ship">[[Dancing in the Storm]]</i> departs [[Meeresdorf]] for [[Senneborn]]
; 1 Thelliea
: <i class="ship">[[Dancing in the Storm]]</i> arrives in [[Senneborn]]; Party departs for [[Kaarst]]
; 3 Thelliea
: [[Captain Felosial Teinithra]] and [[Sergeant Therai Doudra]] patrol narrow side streets of [[Ravensfair]] late at night. Sgt Doudra is knocked unconscious, Cpt Teinithra is abducted by the [[Knives of Mystra]].
; 4 Thelliea
: Sergeant Therai Doudra reports her assault to Kaarst City Watch.
; 11 Thelliea
: Party arrives in [[Kaarst]], visits [[Kade Sirrine Kathedrale]], [[Mira]] joins
; 12 Thelliea
: Party visits [[Kobolwitz Manor]] and [[Squall's Beacon]]
; 13 Thelliea
: Discovery and stakeout of [[Valiant Morgen warehouse]], [[Ashmaker]] attacks
; 14 Thelliea
: Interrogation of captives, jailbreak of [[Uthan]], meeting [[the Tide]], investigating [[Valiant Morgen Trading Company|Valiant Morgen]]
; 15 Thelliea
: [[Sable Warden]] sends party to [[Acropolis of Karaskaa]], party stops [[Knives of Mystra]] just before sunset, planned meeting of [[Kaarst City Council]] is abandoned
; 16 Thelliea
: <i class="ship">[[Hope's Prize]]</i> was due to depart [[Kaarst]]
; 18 Thelliea
: [[Anrel]] awakes in the [[house of healing]] near [[Kade Sirrine Kathedrale]].
; 19 Thelliea
: The [[Galesong Thervan Indále|Galesong]] and [[Sable Warden Meriele Berevan|Sable Warden]] have a final debrief with the heroes of [[Kaarst]]
ca4f6bc014599b695aa123be03502ab0db64d939
572
569
2024-04-27T14:25:25Z
Vicht
1
/* 1853 Post-Accord */ Added Valiant Morgen documents for the purchase of Kobolwitz Manor
wikitext
text/x-wiki
There have been eight Ages, although none among the party can remember the numbering of them. The current year is 1853 Post-Accord (or P.A.).
== Ancient history ==
; Age of Great Ruin
: The soul of a Great Wyrm from this time comes to held in the [[Dragon Orb of Drimysthonontas]].
; Age of Enlightenment
: [[Squall's Beacon]] is constructed, possibly in [[Farankaars]].
: [[Kereskaa]] contains the Dragon Orb of Drimysthonontas. The [[Acropolis of Kereskaa]] is built on top of it.
: A servant of [[Corellon]] gifts a [[feywild tree|tree from the Feywild]] to the Acropolis of Kereskaa for ‘a good deed done’.
: [[Suithrathus Luirmo]] begins his tenure at Acropolis of Kereskaa
: Veteran of the [[Blood Wars]], [[Vastren]] is summoned into the catacomb beneath the [[Spire of Conjuration]] by [[Cansa Cinsmic]]. Vastren describes her as ‘Lost, blind, and running out of time.’
: 576th year of the Age of Enlightenment, approximately 1150 years before the [[Divine Accord]]. [[Teklanna Morantine]] betrays the Acropolis of Kereskaa to the [[Kythera]]ns, who destroy the Acropolis. Suithrathus Luirmo transfers himself to his divining mirror to stay alive. [[Toross Rhistel]] becomes trapped in his mirror device, where he later perishes. [[Elgrex Anderra]] is kept safe in the [[Spire of Abjuration]]. Most of the other Masters and students die in the attack. After three days, Elgrex records a holographic message to her unknown lover, saying she will try to find survivors and travel to [[Geat-Mea]], but her [[Seal]] is eventually found—presumably within the Acropolis—by [[Etorn Hadaran]], suggesting she never escaped. Teklanna Morantine steals the Dragon Orb of Drimysthonontas from the vault.
; Age of Decadence
: A [[Tyrant]] rules [[Kaarst]] with his aid of his arcane followers. The wield magic to enslave other arcane practitioners, and use that magic to raise a giant statue of the Tyrant to the clifftop above the city. The populace does not take kindly to the cruelty and overthrow the Tyrant. His statue is collapsed into [[Kaarst Bay]] where only its hand reaches above the surface, coming to be known as [[Tyrant's Folly]].
; [[Great War]]
: Lasting several hundred years, many souls were lost. Much of the destruction was performed by mages. Flying cities like [[Kythera]] were used as weapons.
: The [[Divine Accord]] ends the Great War. The gods of good and evil agree not to visit the [[Material Plane]]. The Divine Accord is signed by [[Bahamut]] and [[Teli Monei]] at a summit later depicted by a sculpture in [[Kade Sirrine Kathedrale]].
; A little over 500 years ago
: The most recent appearance of the comet [[Ashtkaan]] in the skies above [[Talyen]].
== Recent history==
All years are approximations based on ages (known and apparent) and statements liable to inaccuracy and rounding.
; Approximately 3 generations ago
: The founding of the [[Arkhellen Empire]]. 12 churches are united as [[Verein Kirche von Arkhelle]], although a compromise is made to allow [[Kaarst]] to keep its laws against practising arcane magic.
; 1764–1773
: Birth of [[Maurul Silkendawn]], who now appears to be in his eighties.
; 1794–1798
: Birth of [[Reginald Kobolwitz]], who was in his late fifties when he died.
; 1794–1803
: Birth of [[Irann Rhogar]], who now appears to be in his fifties.
; 1806
: Birth of [[Traulam Eugen]], who is now 47.
; 1816–1820
: Birth of [[Ruda]], who is now in his mid-thirties.
; 1818
: Birth of [[Lorenzo Arkhelle]], who is now 35.
; 1841
: [[King Lorenzo Friedriche Arkhelle XVI]] becomes 3rd Emperor of the Arkhellen Empire.
; 1843
: [[Anrel Salier]] is living in [[Kaarst]] having been raised by the church there.
; 1844
: [[Mirark]]'s tiefling friend disappears
; 1845
: [[Amnon Ingolidan]] begins working at [[Squall's Beacon]].
: Ruda and [[Felosiel Teinithra]] marry.
; 1846
: [[Anrel Salier]] leads his platoon into [[Ùrlar Valley]] to investigate a strange excavation. He loses consciousness and wakes up far away. He believes is the only survivor and does not return to Kaarst.
; 1846–1847
: [[Felosiel Teinithra]] becomes captain of [[Kaarst City Watch]].
; 1848
: [[Kham Gohlrim]] is the only person still speaking to [[Elira Lein]].
; 1850
: [[Armine Detlef]] discovers [[Arnt]] on the streets of [[Kaarst]].
: [[Eurgaran Wihta]] begins working at [[Squall's Beacon]].
: [[Orryn Daergel]] is promoted from Private to Sergeant in [[Kaarst City Watch]].
; 1851
: [[Ruda]] and [[Felosiel Teinithra]] move to their current home in the [[Lamp Ward]].
== 1853 Post-Accord ==
; Seanchai
: [[Kham Gohlrim]] departs his post and disappears. [[Cardinal Maurul Silkendawn]] assumes he has gone to find [[Anrel Salier]].
; Coreivae/Skaerensta
: [[Leagallow Tiaathque]] alleges he hadn't met with [[Ser Reginald Kobolwitz]] since a couple of months before his death
; 25 Skaerentsa
: [[Captain Adran Mokam]] and boatswain [[Thava Windreaver]] are found dead on the lower deck of <i class="ship">[[Hope's Prize]]</i> by the ship's crew while docked in [[Kaarst]].
; Late Skaerensta
: [[Beatrux]] is brought to the [[Zaheer island]] as a slave by [[gnoll]]s.
; 12 Maneseed
: [[Claira Hanali]] visits family in [[Salzreich]], three weeks before returning to work at [[Kobolwitz Manor]].
; Early Maneseed
: [[Valiant Morgen Trading Company]] purchases a [[Valiant Morgen Trading Company warehouse|warehouse]] in Kaarst.
; 19 Maneseed
: [[Father Traulam Eugen]] attempts to meet the [[Tide]] in Kaarst but is ambushed and taken for questioning by the [[Knives of Mystra]].
; 20 Maneseed
: Officials from [[Kade Sirrine Kathedrale]] contact [[Karst City Watch]] to let them know that Father Traulam Eugen did not return to his quarters as expected.
; 2 Thirkuoss
: [[Valiant Morgen Trading Company]] has documents about the purchase of [[Kobolwitz Manor]]
; 3 Thirkuoss
: Claira Hanali discovers Ser Reginald Kobolwitz dead in his drawing room, having been killed by a [[vampire]] several days earlier.
; 9 Thirkuoss
: [[Thodris Holderhek]] is likely killed in the evening while working in the [[Sombre Lyceum]].
; 10 Thirkuoss
: Thodris Holderhek's body is found in the Sombre Lyceum by mourners in the early morning.
: [[Anrel Salier]] cuts off [[Armine Detlef]]'s arm.
; 15 Thirkuoss
: [[Eurgaran Wihta]] leaves home in the evening but does not arrive at [[Squall's Beacon]]. It is likely he is ambushed by [[Eldon Garrick]] and taken to his torture chamber underneath the lighthouse.
; 16 Thirkuoss
: [[Heda Wihta]] reports her husband missing to Kaarst City Watch in the early morning.
; 17 Thirkuoss
: [[Eurgaran Wihta]]'s body is found floating in the harbour by a group of dockworkers early in the morning.
; 25 Thirkuoss
: Party arrives at [[gnoll]] camp in [[Aleph Marsh]]
; 26 Thirkuoss
: Slaves are freed from [[gnoll]] camp and sail to [[Meeresdorf]]
; 27 Thirkuoss
: Party arrives on the [[Zaheer island|island]] and escapes the slave camp
; 28 Thirkuoss
: Party meets ghosts and [[troglodyte|lizard-type folk]] in the [[Zaheer island|island]] caves
; 29 Thirkuoss
: [[Srir Silthallow]] is defeated but [[Rrekkeh Stormcrawler]] escapes
; 30 Thirkuoss
: Survivors leave the [[Zaheer island|island]] aboard <i class="ship">[[Dancing in the Storm]]</i>
; 31 Thirkuoss
: <i class="ship">[[Dancing in the Storm]]</i> departs [[Meeresdorf]] for [[Senneborn]]
; 1 Thelliea
: <i class="ship">[[Dancing in the Storm]]</i> arrives in [[Senneborn]]; Party departs for [[Kaarst]]
; 3 Thelliea
: [[Captain Felosial Teinithra]] and [[Sergeant Therai Doudra]] patrol narrow side streets of [[Ravensfair]] late at night. Sgt Doudra is knocked unconscious, Cpt Teinithra is abducted by the [[Knives of Mystra]].
; 4 Thelliea
: Sergeant Therai Doudra reports her assault to Kaarst City Watch.
; 11 Thelliea
: Party arrives in [[Kaarst]], visits [[Kade Sirrine Kathedrale]], [[Mira]] joins
; 12 Thelliea
: Party visits [[Kobolwitz Manor]] and [[Squall's Beacon]]
; 13 Thelliea
: Discovery and stakeout of [[Valiant Morgen warehouse]], [[Ashmaker]] attacks
; 14 Thelliea
: Interrogation of captives, jailbreak of [[Uthan]], meeting [[the Tide]], investigating [[Valiant Morgen Trading Company|Valiant Morgen]]
; 15 Thelliea
: [[Sable Warden]] sends party to [[Acropolis of Karaskaa]], party stops [[Knives of Mystra]] just before sunset, planned meeting of [[Kaarst City Council]] is abandoned
; 16 Thelliea
: <i class="ship">[[Hope's Prize]]</i> was due to depart [[Kaarst]]
; 18 Thelliea
: [[Anrel]] awakes in the [[house of healing]] near [[Kade Sirrine Kathedrale]].
; 19 Thelliea
: The [[Galesong Thervan Indále|Galesong]] and [[Sable Warden Meriele Berevan|Sable Warden]] have a final debrief with the heroes of [[Kaarst]]
17d77643c209eb59ff26594d521022b09348fe07
573
572
2024-04-27T17:16:15Z
Vicht
1
/* 1853 Post-Accord */ Added Valiant Morgen documents for the purchase of Hope's Prize
wikitext
text/x-wiki
There have been eight Ages, although none among the party can remember the numbering of them. The current year is 1853 Post-Accord (or P.A.).
== Ancient history ==
; Age of Great Ruin
: The soul of a Great Wyrm from this time comes to held in the [[Dragon Orb of Drimysthonontas]].
; Age of Enlightenment
: [[Squall's Beacon]] is constructed, possibly in [[Farankaars]].
: [[Kereskaa]] contains the Dragon Orb of Drimysthonontas. The [[Acropolis of Kereskaa]] is built on top of it.
: A servant of [[Corellon]] gifts a [[feywild tree|tree from the Feywild]] to the Acropolis of Kereskaa for ‘a good deed done’.
: [[Suithrathus Luirmo]] begins his tenure at Acropolis of Kereskaa
: Veteran of the [[Blood Wars]], [[Vastren]] is summoned into the catacomb beneath the [[Spire of Conjuration]] by [[Cansa Cinsmic]]. Vastren describes her as ‘Lost, blind, and running out of time.’
: 576th year of the Age of Enlightenment, approximately 1150 years before the [[Divine Accord]]. [[Teklanna Morantine]] betrays the Acropolis of Kereskaa to the [[Kythera]]ns, who destroy the Acropolis. Suithrathus Luirmo transfers himself to his divining mirror to stay alive. [[Toross Rhistel]] becomes trapped in his mirror device, where he later perishes. [[Elgrex Anderra]] is kept safe in the [[Spire of Abjuration]]. Most of the other Masters and students die in the attack. After three days, Elgrex records a holographic message to her unknown lover, saying she will try to find survivors and travel to [[Geat-Mea]], but her [[Seal]] is eventually found—presumably within the Acropolis—by [[Etorn Hadaran]], suggesting she never escaped. Teklanna Morantine steals the Dragon Orb of Drimysthonontas from the vault.
; Age of Decadence
: A [[Tyrant]] rules [[Kaarst]] with his aid of his arcane followers. The wield magic to enslave other arcane practitioners, and use that magic to raise a giant statue of the Tyrant to the clifftop above the city. The populace does not take kindly to the cruelty and overthrow the Tyrant. His statue is collapsed into [[Kaarst Bay]] where only its hand reaches above the surface, coming to be known as [[Tyrant's Folly]].
; [[Great War]]
: Lasting several hundred years, many souls were lost. Much of the destruction was performed by mages. Flying cities like [[Kythera]] were used as weapons.
: The [[Divine Accord]] ends the Great War. The gods of good and evil agree not to visit the [[Material Plane]]. The Divine Accord is signed by [[Bahamut]] and [[Teli Monei]] at a summit later depicted by a sculpture in [[Kade Sirrine Kathedrale]].
; A little over 500 years ago
: The most recent appearance of the comet [[Ashtkaan]] in the skies above [[Talyen]].
== Recent history==
All years are approximations based on ages (known and apparent) and statements liable to inaccuracy and rounding.
; Approximately 3 generations ago
: The founding of the [[Arkhellen Empire]]. 12 churches are united as [[Verein Kirche von Arkhelle]], although a compromise is made to allow [[Kaarst]] to keep its laws against practising arcane magic.
; 1764–1773
: Birth of [[Maurul Silkendawn]], who now appears to be in his eighties.
; 1794–1798
: Birth of [[Reginald Kobolwitz]], who was in his late fifties when he died.
; 1794–1803
: Birth of [[Irann Rhogar]], who now appears to be in his fifties.
; 1806
: Birth of [[Traulam Eugen]], who is now 47.
; 1816–1820
: Birth of [[Ruda]], who is now in his mid-thirties.
; 1818
: Birth of [[Lorenzo Arkhelle]], who is now 35.
; 1841
: [[King Lorenzo Friedriche Arkhelle XVI]] becomes 3rd Emperor of the Arkhellen Empire.
; 1843
: [[Anrel Salier]] is living in [[Kaarst]] having been raised by the church there.
; 1844
: [[Mirark]]'s tiefling friend disappears
; 1845
: [[Amnon Ingolidan]] begins working at [[Squall's Beacon]].
: Ruda and [[Felosiel Teinithra]] marry.
; 1846
: [[Anrel Salier]] leads his platoon into [[Ùrlar Valley]] to investigate a strange excavation. He loses consciousness and wakes up far away. He believes is the only survivor and does not return to Kaarst.
; 1846–1847
: [[Felosiel Teinithra]] becomes captain of [[Kaarst City Watch]].
; 1848
: [[Kham Gohlrim]] is the only person still speaking to [[Elira Lein]].
; 1850
: [[Armine Detlef]] discovers [[Arnt]] on the streets of [[Kaarst]].
: [[Eurgaran Wihta]] begins working at [[Squall's Beacon]].
: [[Orryn Daergel]] is promoted from Private to Sergeant in [[Kaarst City Watch]].
; 1851
: [[Ruda]] and [[Felosiel Teinithra]] move to their current home in the [[Lamp Ward]].
== 1853 Post-Accord ==
; Seanchai
: [[Kham Gohlrim]] departs his post and disappears. [[Cardinal Maurul Silkendawn]] assumes he has gone to find [[Anrel Salier]].
; Coreivae/Skaerensta
: [[Leagallow Tiaathque]] alleges he hadn't met with [[Ser Reginald Kobolwitz]] since a couple of months before his death
; 25 Skaerentsa
: [[Captain Adran Mokam]] and boatswain [[Thava Windreaver]] are found dead on the lower deck of <i class="ship">[[Hope's Prize]]</i> by the ship's crew while docked in [[Kaarst]].
; 27 Skaerentsa
: [[Valiant Morgen Trading Company]] has documents about the purchase of <i class="ship">[[Hope's Prize]]</i>.
; Late Skaerensta
: [[Beatrux]] is brought to the [[Zaheer island]] as a slave by [[gnoll]]s.
; 12 Maneseed
: [[Claira Hanali]] visits family in [[Salzreich]], three weeks before returning to work at [[Kobolwitz Manor]].
; Early Maneseed
: Valiant Morgen Trading Company purchases a [[Valiant Morgen Trading Company warehouse|warehouse]] in Kaarst.
; 19 Maneseed
: [[Father Traulam Eugen]] attempts to meet the [[Tide]] in Kaarst but is ambushed and taken for questioning by the [[Knives of Mystra]].
; 20 Maneseed
: Officials from [[Kade Sirrine Kathedrale]] contact [[Karst City Watch]] to let them know that Father Traulam Eugen did not return to his quarters as expected.
; 2 Thirkuoss
: Valiant Morgen Trading Company has documents about the purchase of Kobolwitz Manor.
; 3 Thirkuoss
: Claira Hanali discovers Ser Reginald Kobolwitz dead in his drawing room, having been killed by a [[vampire]] several days earlier.
; 9 Thirkuoss
: [[Thodris Holderhek]] is likely killed in the evening while working in the [[Sombre Lyceum]].
; 10 Thirkuoss
: Thodris Holderhek's body is found in the Sombre Lyceum by mourners in the early morning.
: [[Anrel Salier]] cuts off [[Armine Detlef]]'s arm.
; 15 Thirkuoss
: [[Eurgaran Wihta]] leaves home in the evening but does not arrive at [[Squall's Beacon]]. It is likely he is ambushed by [[Eldon Garrick]] and taken to his torture chamber underneath the lighthouse.
; 16 Thirkuoss
: [[Heda Wihta]] reports her husband missing to Kaarst City Watch in the early morning.
; 17 Thirkuoss
: [[Eurgaran Wihta]]'s body is found floating in the harbour by a group of dockworkers early in the morning.
; 25 Thirkuoss
: Party arrives at [[gnoll]] camp in [[Aleph Marsh]]
; 26 Thirkuoss
: Slaves are freed from [[gnoll]] camp and sail to [[Meeresdorf]]
; 27 Thirkuoss
: Party arrives on the [[Zaheer island|island]] and escapes the slave camp
; 28 Thirkuoss
: Party meets ghosts and [[troglodyte|lizard-type folk]] in the [[Zaheer island|island]] caves
; 29 Thirkuoss
: [[Srir Silthallow]] is defeated but [[Rrekkeh Stormcrawler]] escapes
; 30 Thirkuoss
: Survivors leave the [[Zaheer island|island]] aboard <i class="ship">[[Dancing in the Storm]]</i>
; 31 Thirkuoss
: <i class="ship">[[Dancing in the Storm]]</i> departs [[Meeresdorf]] for [[Senneborn]]
; 1 Thelliea
: <i class="ship">[[Dancing in the Storm]]</i> arrives in [[Senneborn]]; Party departs for [[Kaarst]]
; 3 Thelliea
: [[Captain Felosial Teinithra]] and [[Sergeant Therai Doudra]] patrol narrow side streets of [[Ravensfair]] late at night. Sgt Doudra is knocked unconscious, Cpt Teinithra is abducted by the [[Knives of Mystra]].
; 4 Thelliea
: Sergeant Therai Doudra reports her assault to Kaarst City Watch.
; 11 Thelliea
: Party arrives in [[Kaarst]], visits [[Kade Sirrine Kathedrale]], [[Mira]] joins
; 12 Thelliea
: Party visits [[Kobolwitz Manor]] and [[Squall's Beacon]]
; 13 Thelliea
: Discovery and stakeout of [[Valiant Morgen warehouse]], [[Ashmaker]] attacks
; 14 Thelliea
: Interrogation of captives, jailbreak of [[Uthan]], meeting [[the Tide]], investigating [[Valiant Morgen Trading Company|Valiant Morgen]]
; 15 Thelliea
: [[Sable Warden]] sends party to [[Acropolis of Karaskaa]], party stops [[Knives of Mystra]] just before sunset, planned meeting of [[Kaarst City Council]] is abandoned
; 16 Thelliea
: <i class="ship">[[Hope's Prize]]</i> was due to depart [[Kaarst]]
; 18 Thelliea
: [[Anrel]] awakes in the [[house of healing]] near [[Kade Sirrine Kathedrale]].
; 19 Thelliea
: The [[Galesong Thervan Indále|Galesong]] and [[Sable Warden Meriele Berevan|Sable Warden]] have a final debrief with the heroes of [[Kaarst]]
14f0ba342896c87de02059dcbafbe72919b17a88
574
573
2024-04-27T18:25:23Z
Vicht
1
/* Recent history */ Added familiarity between Orianna and Father Traulam Eugen
wikitext
text/x-wiki
There have been eight Ages, although none among the party can remember the numbering of them. The current year is 1853 Post-Accord (or P.A.).
== Ancient history ==
; Age of Great Ruin
: The soul of a Great Wyrm from this time comes to held in the [[Dragon Orb of Drimysthonontas]].
; Age of Enlightenment
: [[Squall's Beacon]] is constructed, possibly in [[Farankaars]].
: [[Kereskaa]] contains the Dragon Orb of Drimysthonontas. The [[Acropolis of Kereskaa]] is built on top of it.
: A servant of [[Corellon]] gifts a [[feywild tree|tree from the Feywild]] to the Acropolis of Kereskaa for ‘a good deed done’.
: [[Suithrathus Luirmo]] begins his tenure at Acropolis of Kereskaa
: Veteran of the [[Blood Wars]], [[Vastren]] is summoned into the catacomb beneath the [[Spire of Conjuration]] by [[Cansa Cinsmic]]. Vastren describes her as ‘Lost, blind, and running out of time.’
: 576th year of the Age of Enlightenment, approximately 1150 years before the [[Divine Accord]]. [[Teklanna Morantine]] betrays the Acropolis of Kereskaa to the [[Kythera]]ns, who destroy the Acropolis. Suithrathus Luirmo transfers himself to his divining mirror to stay alive. [[Toross Rhistel]] becomes trapped in his mirror device, where he later perishes. [[Elgrex Anderra]] is kept safe in the [[Spire of Abjuration]]. Most of the other Masters and students die in the attack. After three days, Elgrex records a holographic message to her unknown lover, saying she will try to find survivors and travel to [[Geat-Mea]], but her [[Seal]] is eventually found—presumably within the Acropolis—by [[Etorn Hadaran]], suggesting she never escaped. Teklanna Morantine steals the Dragon Orb of Drimysthonontas from the vault.
; Age of Decadence
: A [[Tyrant]] rules [[Kaarst]] with his aid of his arcane followers. The wield magic to enslave other arcane practitioners, and use that magic to raise a giant statue of the Tyrant to the clifftop above the city. The populace does not take kindly to the cruelty and overthrow the Tyrant. His statue is collapsed into [[Kaarst Bay]] where only its hand reaches above the surface, coming to be known as [[Tyrant's Folly]].
; [[Great War]]
: Lasting several hundred years, many souls were lost. Much of the destruction was performed by mages. Flying cities like [[Kythera]] were used as weapons.
: The [[Divine Accord]] ends the Great War. The gods of good and evil agree not to visit the [[Material Plane]]. The Divine Accord is signed by [[Bahamut]] and [[Teli Monei]] at a summit later depicted by a sculpture in [[Kade Sirrine Kathedrale]].
; A little over 500 years ago
: The most recent appearance of the comet [[Ashtkaan]] in the skies above [[Talyen]].
== Recent history==
All years are approximations based on ages (known and apparent) and statements liable to inaccuracy and rounding.
; Approximately 3 generations ago
: The founding of the [[Arkhellen Empire]]. 12 churches are united as [[Verein Kirche von Arkhelle]], although a compromise is made to allow [[Kaarst]] to keep its laws against practising arcane magic.
; 1764–1773
: Birth of [[Maurul Silkendawn]], who now appears to be in his eighties.
; 1794–1798
: Birth of [[Reginald Kobolwitz]], who was in his late fifties when he died.
; 1794–1803
: Birth of [[Irann Rhogar]], who now appears to be in his fifties.
; 1806
: Birth of [[Traulam Eugen]], who is now 47.
; 1816–1820
: Birth of [[Ruda]], who is now in his mid-thirties.
; 1818
: Birth of [[Lorenzo Arkhelle]], who is now 35.
; 1841
: [[King Lorenzo Friedriche Arkhelle XVI]] becomes 3rd Emperor of the Arkhellen Empire.
; 1843
: [[Anrel Salier]] is living in [[Kaarst]] having been raised by the church there.
: Approximate time [[Orianna]] and [[Father Traulam Eugen]] ‘become comfortable with each other.’
; 1844
: [[Mirark]]'s tiefling friend disappears
; 1845
: [[Amnon Ingolidan]] begins working at [[Squall's Beacon]].
: Ruda and [[Felosiel Teinithra]] marry.
; 1846
: [[Anrel Salier]] leads his platoon into [[Ùrlar Valley]] to investigate a strange excavation. He loses consciousness and wakes up far away. He believes is the only survivor and does not return to Kaarst.
; 1846–1847
: [[Felosiel Teinithra]] becomes captain of [[Kaarst City Watch]].
; 1848
: [[Kham Gohlrim]] is the only person still speaking to [[Elira Lein]].
; 1850
: [[Armine Detlef]] discovers [[Arnt]] on the streets of [[Kaarst]].
: [[Eurgaran Wihta]] begins working at [[Squall's Beacon]].
: [[Orryn Daergel]] is promoted from Private to Sergeant in [[Kaarst City Watch]].
; 1851
: [[Ruda]] and [[Felosiel Teinithra]] move to their current home in the [[Lamp Ward]].
== 1853 Post-Accord ==
; Seanchai
: [[Kham Gohlrim]] departs his post and disappears. [[Cardinal Maurul Silkendawn]] assumes he has gone to find [[Anrel Salier]].
; Coreivae/Skaerensta
: [[Leagallow Tiaathque]] alleges he hadn't met with [[Ser Reginald Kobolwitz]] since a couple of months before his death
; 25 Skaerentsa
: [[Captain Adran Mokam]] and boatswain [[Thava Windreaver]] are found dead on the lower deck of <i class="ship">[[Hope's Prize]]</i> by the ship's crew while docked in [[Kaarst]].
; 27 Skaerentsa
: [[Valiant Morgen Trading Company]] has documents about the purchase of <i class="ship">[[Hope's Prize]]</i>.
; Late Skaerensta
: [[Beatrux]] is brought to the [[Zaheer island]] as a slave by [[gnoll]]s.
; 12 Maneseed
: [[Claira Hanali]] visits family in [[Salzreich]], three weeks before returning to work at [[Kobolwitz Manor]].
; Early Maneseed
: Valiant Morgen Trading Company purchases a [[Valiant Morgen Trading Company warehouse|warehouse]] in Kaarst.
; 19 Maneseed
: [[Father Traulam Eugen]] attempts to meet the [[Tide]] in Kaarst but is ambushed and taken for questioning by the [[Knives of Mystra]].
; 20 Maneseed
: Officials from [[Kade Sirrine Kathedrale]] contact [[Karst City Watch]] to let them know that Father Traulam Eugen did not return to his quarters as expected.
; 2 Thirkuoss
: Valiant Morgen Trading Company has documents about the purchase of Kobolwitz Manor.
; 3 Thirkuoss
: Claira Hanali discovers Ser Reginald Kobolwitz dead in his drawing room, having been killed by a [[vampire]] several days earlier.
; 9 Thirkuoss
: [[Thodris Holderhek]] is likely killed in the evening while working in the [[Sombre Lyceum]].
; 10 Thirkuoss
: Thodris Holderhek's body is found in the Sombre Lyceum by mourners in the early morning.
: [[Anrel Salier]] cuts off [[Armine Detlef]]'s arm.
; 15 Thirkuoss
: [[Eurgaran Wihta]] leaves home in the evening but does not arrive at [[Squall's Beacon]]. It is likely he is ambushed by [[Eldon Garrick]] and taken to his torture chamber underneath the lighthouse.
; 16 Thirkuoss
: [[Heda Wihta]] reports her husband missing to Kaarst City Watch in the early morning.
; 17 Thirkuoss
: [[Eurgaran Wihta]]'s body is found floating in the harbour by a group of dockworkers early in the morning.
; 25 Thirkuoss
: Party arrives at [[gnoll]] camp in [[Aleph Marsh]]
; 26 Thirkuoss
: Slaves are freed from [[gnoll]] camp and sail to [[Meeresdorf]]
; 27 Thirkuoss
: Party arrives on the [[Zaheer island|island]] and escapes the slave camp
; 28 Thirkuoss
: Party meets ghosts and [[troglodyte|lizard-type folk]] in the [[Zaheer island|island]] caves
; 29 Thirkuoss
: [[Srir Silthallow]] is defeated but [[Rrekkeh Stormcrawler]] escapes
; 30 Thirkuoss
: Survivors leave the [[Zaheer island|island]] aboard <i class="ship">[[Dancing in the Storm]]</i>
; 31 Thirkuoss
: <i class="ship">[[Dancing in the Storm]]</i> departs [[Meeresdorf]] for [[Senneborn]]
; 1 Thelliea
: <i class="ship">[[Dancing in the Storm]]</i> arrives in [[Senneborn]]; Party departs for [[Kaarst]]
; 3 Thelliea
: [[Captain Felosial Teinithra]] and [[Sergeant Therai Doudra]] patrol narrow side streets of [[Ravensfair]] late at night. Sgt Doudra is knocked unconscious, Cpt Teinithra is abducted by the [[Knives of Mystra]].
; 4 Thelliea
: Sergeant Therai Doudra reports her assault to Kaarst City Watch.
; 11 Thelliea
: Party arrives in [[Kaarst]], visits [[Kade Sirrine Kathedrale]], [[Mira]] joins
; 12 Thelliea
: Party visits [[Kobolwitz Manor]] and [[Squall's Beacon]]
; 13 Thelliea
: Discovery and stakeout of [[Valiant Morgen warehouse]], [[Ashmaker]] attacks
; 14 Thelliea
: Interrogation of captives, jailbreak of [[Uthan]], meeting [[the Tide]], investigating [[Valiant Morgen Trading Company|Valiant Morgen]]
; 15 Thelliea
: [[Sable Warden]] sends party to [[Acropolis of Karaskaa]], party stops [[Knives of Mystra]] just before sunset, planned meeting of [[Kaarst City Council]] is abandoned
; 16 Thelliea
: <i class="ship">[[Hope's Prize]]</i> was due to depart [[Kaarst]]
; 18 Thelliea
: [[Anrel]] awakes in the [[house of healing]] near [[Kade Sirrine Kathedrale]].
; 19 Thelliea
: The [[Galesong Thervan Indále|Galesong]] and [[Sable Warden Meriele Berevan|Sable Warden]] have a final debrief with the heroes of [[Kaarst]]
015dce72837250e20344379c707dbc68d7b50b5d
575
574
2024-04-27T18:37:56Z
Vicht
1
/* Ancient history */ Added date for Divine Accord, added birth of Meriele Berevan
wikitext
text/x-wiki
There have been eight Ages, although none among the party can remember the numbering of them. The current year is 1853 Post-Accord (or P.A.).
== Ancient history ==
; Age of Great Ruin
: The soul of a Great Wyrm from this time comes to held in the [[Dragon Orb of Drimysthonontas]].
; Age of Enlightenment
: [[Squall's Beacon]] is constructed, possibly in [[Farankaars]].
: [[Kereskaa]] contains the Dragon Orb of Drimysthonontas. The [[Acropolis of Kereskaa]] is built on top of it.
: A servant of [[Corellon]] gifts a [[feywild tree|tree from the Feywild]] to the Acropolis of Kereskaa for ‘a good deed done’.
: [[Suithrathus Luirmo]] begins his tenure at Acropolis of Kereskaa
: Veteran of the [[Blood Wars]], [[Vastren]] is summoned into the catacomb beneath the [[Spire of Conjuration]] by [[Cansa Cinsmic]]. Vastren describes her as ‘Lost, blind, and running out of time.’
: 576th year of the Age of Enlightenment, approximately 1150 years before the [[Divine Accord]]. [[Teklanna Morantine]] betrays the Acropolis of Kereskaa to the [[Kythera]]ns, who destroy the Acropolis. Suithrathus Luirmo transfers himself to his divining mirror to stay alive. [[Toross Rhistel]] becomes trapped in his mirror device, where he later perishes. [[Elgrex Anderra]] is kept safe in the [[Spire of Abjuration]]. Most of the other Masters and students die in the attack. After three days, Elgrex records a holographic message to her unknown lover, saying she will try to find survivors and travel to [[Geat-Mea]], but her [[Seal]] is eventually found—presumably within the Acropolis—by [[Etorn Hadaran]], suggesting she never escaped. Teklanna Morantine steals the Dragon Orb of Drimysthonontas from the vault.
; Age of Decadence
: A [[Tyrant]] rules [[Kaarst]] with his aid of his arcane followers. The wield magic to enslave other arcane practitioners, and use that magic to raise a giant statue of the Tyrant to the clifftop above the city. The populace does not take kindly to the cruelty and overthrow the Tyrant. His statue is collapsed into [[Kaarst Bay]] where only its hand reaches above the surface, coming to be known as [[Tyrant's Folly]].
; [[Great War]]
: Lasting several hundred years, many souls were lost. Much of the destruction was performed by mages. Flying cities like [[Kythera]] were used as weapons.
; 1853 years ago
: The [[Divine Accord]] ends the Great War. The gods of good and evil agree not to visit the [[Material Plane]]. The Divine Accord is signed by [[Bahamut]] and [[Teli Monei]] at a summit later depicted by a sculpture in [[Kade Sirrine Kathedrale]].
; 600 years ago
: Birth of [[Meriele Berevan]].
; A little over 500 years ago
: The most recent appearance of the comet [[Ashtkaan]] in the skies above [[Talyen]].
== Recent history==
All years are approximations based on ages (known and apparent) and statements liable to inaccuracy and rounding.
; Approximately 3 generations ago
: The founding of the [[Arkhellen Empire]]. 12 churches are united as [[Verein Kirche von Arkhelle]], although a compromise is made to allow [[Kaarst]] to keep its laws against practising arcane magic.
; 1764–1773
: Birth of [[Maurul Silkendawn]], who now appears to be in his eighties.
; 1794–1798
: Birth of [[Reginald Kobolwitz]], who was in his late fifties when he died.
; 1794–1803
: Birth of [[Irann Rhogar]], who now appears to be in his fifties.
; 1806
: Birth of [[Traulam Eugen]], who is now 47.
; 1816–1820
: Birth of [[Ruda]], who is now in his mid-thirties.
; 1818
: Birth of [[Lorenzo Arkhelle]], who is now 35.
; 1841
: [[King Lorenzo Friedriche Arkhelle XVI]] becomes 3rd Emperor of the Arkhellen Empire.
; 1843
: [[Anrel Salier]] is living in [[Kaarst]] having been raised by the church there.
: Approximate time [[Orianna]] and [[Father Traulam Eugen]] ‘become comfortable with each other.’
; 1844
: [[Mirark]]'s tiefling friend disappears
; 1845
: [[Amnon Ingolidan]] begins working at [[Squall's Beacon]].
: Ruda and [[Felosiel Teinithra]] marry.
; 1846
: [[Anrel Salier]] leads his platoon into [[Ùrlar Valley]] to investigate a strange excavation. He loses consciousness and wakes up far away. He believes is the only survivor and does not return to Kaarst.
; 1846–1847
: [[Felosiel Teinithra]] becomes captain of [[Kaarst City Watch]].
; 1848
: [[Kham Gohlrim]] is the only person still speaking to [[Elira Lein]].
; 1850
: [[Armine Detlef]] discovers [[Arnt]] on the streets of [[Kaarst]].
: [[Eurgaran Wihta]] begins working at [[Squall's Beacon]].
: [[Orryn Daergel]] is promoted from Private to Sergeant in [[Kaarst City Watch]].
; 1851
: [[Ruda]] and [[Felosiel Teinithra]] move to their current home in the [[Lamp Ward]].
== 1853 Post-Accord ==
; Seanchai
: [[Kham Gohlrim]] departs his post and disappears. [[Cardinal Maurul Silkendawn]] assumes he has gone to find [[Anrel Salier]].
; Coreivae/Skaerensta
: [[Leagallow Tiaathque]] alleges he hadn't met with [[Ser Reginald Kobolwitz]] since a couple of months before his death
; 25 Skaerentsa
: [[Captain Adran Mokam]] and boatswain [[Thava Windreaver]] are found dead on the lower deck of <i class="ship">[[Hope's Prize]]</i> by the ship's crew while docked in [[Kaarst]].
; 27 Skaerentsa
: [[Valiant Morgen Trading Company]] has documents about the purchase of <i class="ship">[[Hope's Prize]]</i>.
; Late Skaerensta
: [[Beatrux]] is brought to the [[Zaheer island]] as a slave by [[gnoll]]s.
; 12 Maneseed
: [[Claira Hanali]] visits family in [[Salzreich]], three weeks before returning to work at [[Kobolwitz Manor]].
; Early Maneseed
: Valiant Morgen Trading Company purchases a [[Valiant Morgen Trading Company warehouse|warehouse]] in Kaarst.
; 19 Maneseed
: [[Father Traulam Eugen]] attempts to meet the [[Tide]] in Kaarst but is ambushed and taken for questioning by the [[Knives of Mystra]].
; 20 Maneseed
: Officials from [[Kade Sirrine Kathedrale]] contact [[Karst City Watch]] to let them know that Father Traulam Eugen did not return to his quarters as expected.
; 2 Thirkuoss
: Valiant Morgen Trading Company has documents about the purchase of Kobolwitz Manor.
; 3 Thirkuoss
: Claira Hanali discovers Ser Reginald Kobolwitz dead in his drawing room, having been killed by a [[vampire]] several days earlier.
; 9 Thirkuoss
: [[Thodris Holderhek]] is likely killed in the evening while working in the [[Sombre Lyceum]].
; 10 Thirkuoss
: Thodris Holderhek's body is found in the Sombre Lyceum by mourners in the early morning.
: [[Anrel Salier]] cuts off [[Armine Detlef]]'s arm.
; 15 Thirkuoss
: [[Eurgaran Wihta]] leaves home in the evening but does not arrive at [[Squall's Beacon]]. It is likely he is ambushed by [[Eldon Garrick]] and taken to his torture chamber underneath the lighthouse.
; 16 Thirkuoss
: [[Heda Wihta]] reports her husband missing to Kaarst City Watch in the early morning.
; 17 Thirkuoss
: [[Eurgaran Wihta]]'s body is found floating in the harbour by a group of dockworkers early in the morning.
; 25 Thirkuoss
: Party arrives at [[gnoll]] camp in [[Aleph Marsh]]
; 26 Thirkuoss
: Slaves are freed from [[gnoll]] camp and sail to [[Meeresdorf]]
; 27 Thirkuoss
: Party arrives on the [[Zaheer island|island]] and escapes the slave camp
; 28 Thirkuoss
: Party meets ghosts and [[troglodyte|lizard-type folk]] in the [[Zaheer island|island]] caves
; 29 Thirkuoss
: [[Srir Silthallow]] is defeated but [[Rrekkeh Stormcrawler]] escapes
; 30 Thirkuoss
: Survivors leave the [[Zaheer island|island]] aboard <i class="ship">[[Dancing in the Storm]]</i>
; 31 Thirkuoss
: <i class="ship">[[Dancing in the Storm]]</i> departs [[Meeresdorf]] for [[Senneborn]]
; 1 Thelliea
: <i class="ship">[[Dancing in the Storm]]</i> arrives in [[Senneborn]]; Party departs for [[Kaarst]]
; 3 Thelliea
: [[Captain Felosial Teinithra]] and [[Sergeant Therai Doudra]] patrol narrow side streets of [[Ravensfair]] late at night. Sgt Doudra is knocked unconscious, Cpt Teinithra is abducted by the [[Knives of Mystra]].
; 4 Thelliea
: Sergeant Therai Doudra reports her assault to Kaarst City Watch.
; 11 Thelliea
: Party arrives in [[Kaarst]], visits [[Kade Sirrine Kathedrale]], [[Mira]] joins
; 12 Thelliea
: Party visits [[Kobolwitz Manor]] and [[Squall's Beacon]]
; 13 Thelliea
: Discovery and stakeout of [[Valiant Morgen warehouse]], [[Ashmaker]] attacks
; 14 Thelliea
: Interrogation of captives, jailbreak of [[Uthan]], meeting [[the Tide]], investigating [[Valiant Morgen Trading Company|Valiant Morgen]]
; 15 Thelliea
: [[Sable Warden]] sends party to [[Acropolis of Karaskaa]], party stops [[Knives of Mystra]] just before sunset, planned meeting of [[Kaarst City Council]] is abandoned
; 16 Thelliea
: <i class="ship">[[Hope's Prize]]</i> was due to depart [[Kaarst]]
; 18 Thelliea
: [[Anrel]] awakes in the [[house of healing]] near [[Kade Sirrine Kathedrale]].
; 19 Thelliea
: The [[Galesong Thervan Indále|Galesong]] and [[Sable Warden Meriele Berevan|Sable Warden]] have a final debrief with the heroes of [[Kaarst]]
fb60ff543b45b6decd1f59efd34442ed901cb837
Notes:Tide invitation
100
325
570
2024-04-25T15:25:15Z
Vicht
1
Created page with "You draw far too much attention to yourselves.<br> We've invited your friend for a few drinks—the Baron's Cask is a fine establishment after dark."
wikitext
text/x-wiki
You draw far too much attention to yourselves.<br>
We've invited your friend for a few drinks—the Baron's Cask is a fine establishment after dark.
5e96ec1221d8e8a8995abcfad434b3823000ba6c
Template:Characters
10
147
571
303
2024-04-26T00:29:35Z
Vicht
1
Added Grokbert, Michael, Kham, fixed Kham links to Anrel
wikitext
text/x-wiki
{{Navbox
| state = plain
| listclass = hlist
| title = Characters
| group1 = Heroes
| list1 =
{{Navbox|child
| group2 = An Arkhellen Adventure
| list2 =
* [[Grokko]]
* [[Kenneth]]
* [[Anrel]]
** [[Grimm]]
* [[Mira]]
** [[Etaf]]
* [[Vichthart]]
| group3 = [[The Piß Keepers]]
| list3 =
* [[Elias]]
* [[Grezz]]
* [[Cora Hothead]]
* [[Slabbledab]]
| group4 = Dragon Barrow
| list4 =
* [[Mai Dèanta]]
* [[Iagan Liath]]
* [[Ealar Sgàrlaid]]
* [[Tasgall Uaine]]
| group5 = Talyen Tales
| list5 =
* [[Elmar Grunmeier]]
* [[Tayana Ralovyre]]
* [[Verdec Sharakas]]
* [[Kuno Wirz]]
}} <!-- End Heroes -->
| group6 = [[Meeresdorf]]
| list6 =
* [[Barthon]]
* [[Bracka]]
* [[Solomon Dugraf]]
* [[Lania Falst]]
* [[Captain Gaardan Haupmann]]
* [[Marta Tierstärk]]
* [[Merric Tierstärk]]
| group7 = [[Senneborn]]
| list7 =
* [[St Anorad]]
* [[Judita Bandelmann]]
* [[Captain Eggehart]]
* [[Ogdavis]]
* [[Kerstin Pletscher]]
* [[Brumnir Torfelt]]
| group8 = Droghen
| list8 =
* [[Arnt]]
* [[Bertrand]]
* [[Bezur]]
* [[Bill]]
* [[Davin]]
* [[Armine Detlef]]
* [[Droghen]]
* [[Falk]]
* [[Hilta]]
* [[Jochim]]
* [[Knuth]]
* [[Ogak]]
* [[Spotter]]
* [[Swiper]]
* [[Talxa]]
* [[Tark]]
* [[Vantan]]
| group9 = [[Zaheer island|Island]]
| list9 =
* [[Beatrux]]
* [[Celia]]
* [[Heineer Doonan]]
* [[Kylian]]
* [[Preston]]
* [[Srir Silthallow]]
* [[Szehga Silthallow]]
* [[Rrekkeh Stormcrawler]]
* [[Watcher]]
* [[Prince Yunogu]]
| group10 = [[Roughspun Coast]]
| list10 =
* [[Jenora Greenheart]]
* [[Handy]]
* [[Irebi]]
* [[Mist]]
* [[Tatha]]
* [[Yks]]
| group11 = [[Verein Kirche von Arkhelle]]
| list11 =
* [[Sable Warden Meriele Berevan]]
* [[Black]]
* [[Father Traulam Eugen]]
* [[Fenwar Twins]]
* [[Decheimül Fezzilbahn]]
* [[Father Eivald Glissan]]
* [[Kham Gohlrim]]
* [[Holy Quorum]]
* [[Galesong Thervan Indále]]
* [[Pas]]
* [[Ingen Persson]]
* [[Cardinal Maurul Silkendawn]]
* [[Maghn Ünthergol]]
| group12 = [[Kaarst]]
| list12 =
{{Navbox|child
| group13 = [[Kaarst City Watch|City Watch]]
| list13 =
* [[Orryn Daergel]]
* [[Sergeant Therai Doudra]]
* [[Eren]]
* [[Hilde]]
* [[Lieutenant General Inafel]]
* [[Tamaran]]
* [[Captain Felosiel Teinithra]]
* [[Vanas]]
| group14 = [[Squall's Beacon]]
| list14 =
* [[Eldon Garrick]]
* [[Amnon Ingolidan]]
* [[Samus]]
* [[Eurgaran Wihta]]
* [[Heda Wihta]]
| group15 = [[Knives of Mystra]]
| list15 =
* [[Aran]]
* [[Etorn Hadaran]]
* [[Reiner Hoss]]
* [[Leagallow Tiaathque]]
* [[Uthan]]
* [[Yaan]]
| group16 = [[The Tide]]
| list16 =
* [[Arnuanna]]
* [[Esker]]
* [[Luther]]
* [[Orianna]]
* [[Rewyn]]
| group17 = [[Valiant Morgen Trading Company|Valiant Morgen]]
| list17 =
* [[Antoniya Brosch]]
* [[Heathress Erenbund]]
* [[Malte Faerber]]
* [[Captain Adran Mokam]]
* [[Caphri Pilc]]
* [[Irann Rhogar]]
* [[Anselm Teklanis]]
* [[Tilos]]
* [[Thava Windreaver]]
| group18 = [[Acropolis of Kereskaa]]
| list18 =
* [[Elgrex Anderra]]
* [[Cansa Cinsmic]]
* [[Befrir Dalovamri]]
* [[Henry Hungleberry]]
* [[Suithrathus Luirmo]]
* [[Teklanna Morantine]]
* [[Farlu Naenreh]]
* [[Toross Rhistel]]
* [[Vithra Rutgeth]]
* [[Vastren]]
| group19 = Other
| list19 =
* [[Achima]]
* [[Bogdan]]
* [[Bogdin]]
* [[Delilah]]
* [[Governor Escherin]]
* [[Ruda Frank]]
* [[Ginger]]
* [[Claira Hanali]]
* [[Ertus Heda]]
* [[Thodris Holderheck]]
* [[Ser Reginald Kobolwitz]]
* [[Xandahire Kobolwitz]]
* [[C. B. L.]]
* [[Elira Lein]]
* [[Lilly]]
* [[Administrator Lorsalyn Pri]]
* [[Tyrant]]
}} <!-- End Kaarst subsets -->
| group20 = [[Fuarcrùn Freeholds]]
| list20 =
* [[Draca]]
* [[Ingen]]
* [[Kaelinu]]
| group21 = [[Havenhaft]]
| list21 =
* [[Charles]]
* [[Eoin]]
* [[James]]
* [[Alafonz Kalazorn]]
* [[Shusk]]
| group22 = [[Bergstraßer]]
| list22 =
* [[Iron Fang]]
* [[Seebo]]
* [[Doug Zenner]]
| group23 = [[Arkhellen Empire]]
| list23 =
* [[Anastel]]
* [[King Lorenz Friedriche Arkhelle XVI]]
* [[Mistress Illefina]]
* [[Iron Tempest Mercenary Company]]
* [[Nikola]]
* [[Rosamund]]
| group24 = [[Calaha]]
| list24 =
* [[Burning Lord]]
* [[Conflagracy]]
| group25 = Gods
| list25 =
{{Navbox|child
| group26 = [[Verein Kirche von Arkhelle]]
| list26 =
* [[Avandra]]
* [[Bahamut]]
* [[Erathis]]
* [[Ioun]]
* [[Kord]]
* [[Moradin]]
* [[Mystra]]
* [[Pelor]]
* [[Raven Queen]]
* [[Sarenrae]]
* [[Selune]]
* [[Zaheer]]
| group27 = Other
| list27 =
* [[Bane]]
* [[Corellon]]
* [[Gruumsch]]
* [[Teli Monei]]
}} <!-- End of Gods -->
| group28 = Pseudonyms
| list28 =
* [[Etorn Hadaran|Ashmaker]]
* [[Suithrathus Luirmo|Mr Curtain]]
* [[Esker|E]]
* [[Anrel|Frank]]
* [[Grokko|Grokbert]]
* [[Szehga Silthallow|Gurta]]
* [[Szehga Silthallow|Haga]]
* [[Arnuanna|J]]
* [[Vichthart|Señor José]]
* [[Grokko|Julian]]
* [[Mystra|Kereskaa]]
* [[Kham]]
* [[Vichthart|Michael]]
* [[Grimm|Moose Knuckle]]
* [[Anrel|My Emotions Will Never Hurt Me]]
* [[Vichthart|Priest Man]]
* [[Kenneth|Stoneboy]]
* [[Grokko|Strangehands]]
* [[Orianna|V]]
| group29 = Unknown
| list29 =
* [[Billy-Bob Gene-Joel]]
* [[Erdak]]
* [[Evailen]]
* [[Gurnin]]
* [[Jathnel]]
* [[Kinrel]]
* [[Florine Oakstein]]
}}
9d9e68b4a0e5626068d96e21af6a04501982c42f
Template:Locations
10
148
576
314
2024-04-28T00:37:56Z
Vicht
1
Separated Kaarst locations into Taverns and Residences, added Rhogar's, Doudra's and Teinithra's houses, and Kaarst Bay
wikitext
text/x-wiki
{{Navbox
| state = plain
| listclass = hlist
| title = Locations
| group1 = Planes
| list1 =
* [[Nine Hells]]
** [[Nessus]]
* [[Feywild]]
| group2 = Bodies
| list2 =
* [[Asíl]]
* [[Ashtkhaan]]
{{Navbox|child
| group3 = [[Talyen]]
| list3 =
* [[Calaha]]
** [[Dhintay]]
* [[Eaos]]
* [[Savra]]
* [[Spanish]]
{{Navbox|child
| group4 = [[Elengon]]
| list4 =
* [[Fuarcrùn Freeholds]]
** [[Scierce]]
** [[Ùrlar Valley]]
* [[Ifkhamurud]]
* [[Kythera]]
* [[Leurisan]]
* [[Medinian Republic]]
* [[Rossaña]]
* [[Süddorn]]
* [[Sundering Sea]]
* [[Wüstenwast]]
{{Navbox|child
| group5 = [[Arkhellen Empire]]
| list5 =
* [[Arkhelle]]
** [[Baumeln]]
** [[Heldruh]]
** [[Hellenhelm]]
*** [[Basilica Endeavorant]]
*** [[Wesselbern Palast]]
* [[Brenhalt]]
** [[Kalazorn Ranch]]
** [[Bükerstadt]]
** [[Stolzfestung]]
* [[Denkrei]]
** [[Bergstraßer]]
*** [[The Vicious Crab]]
*** [[Mountain Iron]]
** [[Schmiedentruum]]
* [[Teremberg]]
* [[Vargesse]]
* [[Verrameln]]
* [[Würtzollen]]
** [[Ostweg-Treffen]]
{{Navbox|child
| group6 = [[Scharn]]
| list6 =
* [[Aern]]
* [[Heidestedt]]
* [[Roughspun Coast]]
* [[Salz Bay]]
* [[Scharnwald]]
{{Navbox|child
| group7 = [[Western Scharn]]
| list7 =
* [[Aleph Marsh]]
* [[Cralw]]
* [[Bacheim]]
* [[Darkwasser Wald]]
* [[Droghen's keep]]
* [[Gnoll encampment]]
* [[Zaheer island]]
* [[Kusen]]
* [[Löwenalt]]
* [[Salzreich]]
* [[Strandholm]]
* [[Wurzel Drain]]
* [[Wüsthafen]]
{{Navbox|child
| group8 = [[Meeresdorf]]
| list8 =
* [[Bear's End Inn]]
* [[Blue Birch Costermonger]]
* [[The Dauntless Shield]]
| group9 = [[Senneborn]]
| list9 =
* [[Broken Thorn]]
* [[Church of St Anorad]]
* [[The Katz und Imp]]
* [[Ogdavis' Apotheker]]
* [[Ratway]]
* [[Schnellhoof Carriagemaster's]]
}} <!-- End of Western Scharn -->
| group10 = [[Kaarst]]
| list10 =
* [[Anshaung Bridge]]
* [[City Watch Headquarters]]
* [[Kaarst Bay]]
* [[Kaarst City Waterworks Guild]]
* [[Kade Sirrine Kathedrale]]
* [[Karmesin Palast]]
* [[Lighning Tree]]
* [[Mastaff River]]
* [[Ravensfair]]
* [[Sombre Lyceum]]
* [[Squall's Beacon]]
* [[Valiant Morgen Trading Company Kaarst Branch]]
* [[Valiant Morgen Trading Company warehouse]]
{{Navbox|child
| group11 = Taverns
| list11 =
* [[Baron's Cask]]
* [[Cask of the Lonely Drunkard]]
* [[The Copper Roost]]
* [[Drunkard's Cask]]
* [[Jonathan's Tavern]]
* [[The Sunken Giant]]
| group12 = Shops
| list12 =
* [[Delilah's Delicatessan]]
* [[Kaarst Kebab Shop]]
* [[Lily's Pastries and Baked Goods]]
* [[Lion's Apothecary]]
* [[The Night Stone]]
* [[Tiaathque's Medicinal Remedies]]
| group13 = Residences
| list13 =
* [[Therai Doudra's house]]
* [[Kobolwitz Manor]]
* [[Irann Rhogar's house]]
* [[Felosiel Teinithra's house]]
| group14 = Wards
| list14 =
* [[Bell Ward]]
* [[Flock Ward]]
* [[Lamp Ward]]
* [[Mastaff Ward]]
* [[Rook Ward]]
* [[Outer City]]
| group15 = [[Acropolis of Kereskaa]]
| list15 =
* [[Spire of Conjuration]]
* [[Spire of Divination]]
* [[Spire of Necromancy]]
* [[Spire of Abjuration]]
* [[Spire of Evocation]]
* [[Spire of Illusion]]
* [[Spire of Enchantment]]
* [[Spire of Transmutation]]
}} <!-- End of Kaarst -->
}} <!-- End Scharn -->
}} <!-- End of Arkhellen Empire -->
}} <!-- End of Elengon -->
}} <!-- End of Talyen -->
}} <!-- End of Bodies -->
}} <!-- End -->
0fda2da79fa07da6b71d55a4ccdb4cda824f4536
591
576
2024-04-28T23:54:12Z
Vicht
1
Correct spelling of St Anarad
wikitext
text/x-wiki
{{Navbox
| state = plain
| listclass = hlist
| title = Locations
| group1 = Planes
| list1 =
* [[Nine Hells]]
** [[Nessus]]
* [[Feywild]]
| group2 = Bodies
| list2 =
* [[Asíl]]
* [[Ashtkhaan]]
{{Navbox|child
| group3 = [[Talyen]]
| list3 =
* [[Calaha]]
** [[Dhintay]]
* [[Eaos]]
* [[Savra]]
* [[Spanish]]
{{Navbox|child
| group4 = [[Elengon]]
| list4 =
* [[Fuarcrùn Freeholds]]
** [[Scierce]]
** [[Ùrlar Valley]]
* [[Ifkhamurud]]
* [[Kythera]]
* [[Leurisan]]
* [[Medinian Republic]]
* [[Rossaña]]
* [[Süddorn]]
* [[Sundering Sea]]
* [[Wüstenwast]]
{{Navbox|child
| group5 = [[Arkhellen Empire]]
| list5 =
* [[Arkhelle]]
** [[Baumeln]]
** [[Heldruh]]
** [[Hellenhelm]]
*** [[Basilica Endeavorant]]
*** [[Wesselbern Palast]]
* [[Brenhalt]]
** [[Kalazorn Ranch]]
** [[Bükerstadt]]
** [[Stolzfestung]]
* [[Denkrei]]
** [[Bergstraßer]]
*** [[The Vicious Crab]]
*** [[Mountain Iron]]
** [[Schmiedentruum]]
* [[Teremberg]]
* [[Vargesse]]
* [[Verrameln]]
* [[Würtzollen]]
** [[Ostweg-Treffen]]
{{Navbox|child
| group6 = [[Scharn]]
| list6 =
* [[Aern]]
* [[Heidestedt]]
* [[Roughspun Coast]]
* [[Salz Bay]]
* [[Scharnwald]]
{{Navbox|child
| group7 = [[Western Scharn]]
| list7 =
* [[Aleph Marsh]]
* [[Cralw]]
* [[Bacheim]]
* [[Darkwasser Wald]]
* [[Droghen's keep]]
* [[Gnoll encampment]]
* [[Zaheer island]]
* [[Kusen]]
* [[Löwenalt]]
* [[Salzreich]]
* [[Strandholm]]
* [[Wurzel Drain]]
* [[Wüsthafen]]
{{Navbox|child
| group8 = [[Meeresdorf]]
| list8 =
* [[Bear's End Inn]]
* [[Blue Birch Costermonger]]
* [[The Dauntless Shield]]
| group9 = [[Senneborn]]
| list9 =
* [[Broken Thorn]]
* [[Church of St Anarad]]
* [[The Katz und Imp]]
* [[Ogdavis' Apotheker]]
* [[Ratway]]
* [[Schnellhoof Carriagemaster's]]
}} <!-- End of Western Scharn -->
| group10 = [[Kaarst]]
| list10 =
* [[Anshaung Bridge]]
* [[City Watch Headquarters]]
* [[Kaarst Bay]]
* [[Kaarst City Waterworks Guild]]
* [[Kade Sirrine Kathedrale]]
* [[Karmesin Palast]]
* [[Lighning Tree]]
* [[Mastaff River]]
* [[Ravensfair]]
* [[Sombre Lyceum]]
* [[Squall's Beacon]]
* [[Valiant Morgen Trading Company Kaarst Branch]]
* [[Valiant Morgen Trading Company warehouse]]
{{Navbox|child
| group11 = Taverns
| list11 =
* [[Baron's Cask]]
* [[Cask of the Lonely Drunkard]]
* [[The Copper Roost]]
* [[Drunkard's Cask]]
* [[Jonathan's Tavern]]
* [[The Sunken Giant]]
| group12 = Shops
| list12 =
* [[Delilah's Delicatessan]]
* [[Kaarst Kebab Shop]]
* [[Lily's Pastries and Baked Goods]]
* [[Lion's Apothecary]]
* [[The Night Stone]]
* [[Tiaathque's Medicinal Remedies]]
| group13 = Residences
| list13 =
* [[Therai Doudra's house]]
* [[Kobolwitz Manor]]
* [[Irann Rhogar's house]]
* [[Felosiel Teinithra's house]]
| group14 = Wards
| list14 =
* [[Bell Ward]]
* [[Flock Ward]]
* [[Lamp Ward]]
* [[Mastaff Ward]]
* [[Rook Ward]]
* [[Outer City]]
| group15 = [[Acropolis of Kereskaa]]
| list15 =
* [[Spire of Conjuration]]
* [[Spire of Divination]]
* [[Spire of Necromancy]]
* [[Spire of Abjuration]]
* [[Spire of Evocation]]
* [[Spire of Illusion]]
* [[Spire of Enchantment]]
* [[Spire of Transmutation]]
}} <!-- End of Kaarst -->
}} <!-- End Scharn -->
}} <!-- End of Arkhellen Empire -->
}} <!-- End of Elengon -->
}} <!-- End of Talyen -->
}} <!-- End of Bodies -->
}} <!-- End -->
4243c7482556163e3b407a29177f64ab81f76eec
Irann Rhogar's house
0
326
577
2024-04-28T01:38:53Z
Vicht
1
Created page with "<b>Irann Rhogar's house</b> is located in [[Kaarst]]. The party visits it on the morning of [[Timeline|15 Thelliea]] with the [[Sable Warden Meriele Berevan]], who teleports them from there to the [[Acropolis of Kereskaa]]. == Description == Rhogar's house is a stately home in the southernmost block of the [[Bell Ward]], not as large as [[Kobolwitz Manor]]. It is a nice house, and well kept, but the interior is tackily decorated, as though by someone who has only recent..."
wikitext
text/x-wiki
<b>Irann Rhogar's house</b> is located in [[Kaarst]]. The party visits it on the morning of [[Timeline|15 Thelliea]] with the [[Sable Warden Meriele Berevan]], who teleports them from there to the [[Acropolis of Kereskaa]].
== Description ==
Rhogar's house is a stately home in the southernmost block of the [[Bell Ward]], not as large as [[Kobolwitz Manor]]. It is a nice house, and well kept, but the interior is tackily decorated, as though by someone who has only recently come into wealth and is keen the spend much too much on a showy home. It contains lots of pictures and golden candlesticks.
The main foyer contains a stairwell, and one room upstairs is a study that Rhogar used as a teleportation chamber. Its furniture was pushed against one wall to clear space, and on the floor was a circle on runic sigils that had evidently been drawn in ink and chalk repeatedly, which [[Grokko]] recognizes as a circle of teleportation, used by mages to travel huge distances. This study contained a stockpile of unusual chalks and bottles of ink.
When the party entered the house, the front door was ajar, the curtains were drawn, and no candles or lanterns were lit. In the main foyer, either side of the stairwell, the bodies of the two surveilling Raven Guards had been pinned to the walls with daggers through their arms and chests. Their jaws had been pulled from their faces, the necks had been pierced and ripped, and blood had pooled beneath them. On the wall above each corpse, their blood had been used to write a message in two parts.
<blockquote>Petty tyrants of lesser gods will not stop us.</blockquote>
<blockquote>Seven stars will burn bright this night.</blockquote>
== History ==
On the night of 14 Thelliea, after exploring <i class="ship">[[Hope's Prize]]</i>, [[Vichthart]] used [[Sending]] to confide in the Sable Warden.
<blockquote><b>Vichthart:</b> There are vampires in Kaarst working with Irann Rhogar. Hope's Prize smuggled contraband explosive to magic. We must meet to discuss and share evidence.</blockquote>
<blockquote><b>Sable Warden:</b> These are worrying claims, I trust not made lightly. I will send my seekers. Bring your evidence to me after sunrise.</blockquote>
The Sable Warden sent a pair of [[Raven Guard]]s to surveil the property. The party rescued [[Father Traulam Eugen]] from [[Valiant Morgen Trading Company Kaarst Branch]], and he convinced [[Vichthart]] that he could trust the Sable Warden.
On the morning of 15 Thelliea, Vichthart took Traulam and [[Grokko]] to the cathedral and shared their evidence with the Sable Warden. She informed them that the Valiant Morgen headquarters had burnt down the night before. When Traulam confirmed their claims that the building had not been on fire when they'd left, she used Sending to message the guards posted at Rhogar's house.
<blockquote><b>Sable Warden:</b> Apprehend target and any accomplices.</blockquote>
After a moment she messaged them again.
<blockquote><b>Sable Warden:</b> Acknowledge this message: You are to act upon the target.</blockquote>
The Sable Warden confirmed that her guards were not responding, then snapped her fingers and strode off, followed by two Raven Guards they hadn't noticed standing in the shadows. Apprehensively, Grokko and Vichthart followed.
Outside, Grokko grabbed [[Mira]] and [[Anrel]] held onto Vichthart to follow with his hood over his face. Together they strode south through the streets of Kaarst as fast as they coulc without appearing to hurry. [[Grimm]] telepathically informed Anrel that the guards posted outside [[Squall's Beacon]] had departed, and on the journey an extra pair of Raven Guards joined the procession.
When they arrived at Irann Rhogar's house, they began searching the house, finding the incomplete teleportation circle and a journal containing a diagram of the circle's completed form and a [[spell scroll of Teleportation]]. While Anrel and Mira visited [[Tiaathque's Medicinal Remedies]] to gather supplies, the Sable Warden spent time to complete the teleportation circle and explained some of Kaarst's history to Grokko.
When Anrel and Mira—as well as Grimm—arrived back at Rhogar's house, the Sable Warden used the spell scroll to teleport the party to wherever the circle leads, which turned out to be the [[Acropolis of Kereskaa]].
{{Locations}}
[[Category:Residences]]
dc2682a9a34d48cca1ffc1468132ab07981fb9e3
578
577
2024-04-28T01:47:53Z
Vicht
1
Added Mira's acquisition from the house
wikitext
text/x-wiki
<b>Irann Rhogar's house</b> is located in [[Kaarst]]. The party visits it on the morning of [[Timeline|15 Thelliea]] with the [[Sable Warden Meriele Berevan]], who teleports them from there to the [[Acropolis of Kereskaa]].
== Description ==
Rhogar's house is a stately home in the southernmost block of the [[Bell Ward]], not as large as [[Kobolwitz Manor]]. It is a nice house, and well kept, but the interior is tackily decorated, as though by someone who has only recently come into wealth and is keen the spend much too much on a showy home. It contains lots of pictures and golden candlesticks.
The main foyer contains a stairwell, and one room upstairs is a study that Rhogar used as a teleportation chamber. Its furniture was pushed against one wall to clear space, and on the floor was a circle on runic sigils that had evidently been drawn in ink and chalk repeatedly, which [[Grokko]] recognizes as a circle of teleportation, used by mages to travel huge distances. This study contained a stockpile of unusual chalks and bottles of ink.
When the party entered the house, the front door was ajar, the curtains were drawn, and no candles or lanterns were lit. In the main foyer, either side of the stairwell, the bodies of the two surveilling Raven Guards had been pinned to the walls with daggers through their arms and chests. Their jaws had been pulled from their faces, the necks had been pierced and ripped, and blood had pooled beneath them. On the wall above each corpse, their blood had been used to write a message in two parts.
<blockquote>Petty tyrants of lesser gods will not stop us.</blockquote>
<blockquote>Seven stars will burn bright this night.</blockquote>
== History ==
On the night of 14 Thelliea, after exploring <i class="ship">[[Hope's Prize]]</i>, [[Vichthart]] used [[Sending]] to confide in the Sable Warden.
<blockquote><b>Vichthart:</b> There are vampires in Kaarst working with Irann Rhogar. Hope's Prize smuggled contraband explosive to magic. We must meet to discuss and share evidence.</blockquote>
<blockquote><b>Sable Warden:</b> These are worrying claims, I trust not made lightly. I will send my seekers. Bring your evidence to me after sunrise.</blockquote>
The Sable Warden sent a pair of [[Raven Guard]]s to surveil the property. The party rescued [[Father Traulam Eugen]] from [[Valiant Morgen Trading Company Kaarst Branch]], and he convinced [[Vichthart]] that he could trust the Sable Warden.
On the morning of 15 Thelliea, Vichthart took Traulam and [[Grokko]] to the cathedral and shared their evidence with the Sable Warden. She informed them that the Valiant Morgen headquarters had burnt down the night before. When Traulam confirmed their claims that the building had not been on fire when they'd left, she used Sending to message the guards posted at Rhogar's house.
<blockquote><b>Sable Warden:</b> Apprehend target and any accomplices.</blockquote>
After a moment she messaged them again.
<blockquote><b>Sable Warden:</b> Acknowledge this message: You are to act upon the target.</blockquote>
The Sable Warden confirmed that her guards were not responding, then snapped her fingers and strode off, followed by two Raven Guards they hadn't noticed standing in the shadows. Apprehensively, Grokko and Vichthart followed.
Outside, Grokko grabbed [[Mira]] and [[Anrel]] held onto Vichthart to follow with his hood over his face. Together they strode south through the streets of Kaarst as fast as they coulc without appearing to hurry. [[Grimm]] telepathically informed Anrel that the guards posted outside [[Squall's Beacon]] had departed, and on the journey an extra pair of Raven Guards joined the procession.
When they arrived at Irann Rhogar's house, they began searching the house, finding the incomplete teleportation circle and a journal containing a diagram of the circle's completed form and a [[spell scroll of Teleportation]]. The Sable Warden advised the party to make preparations to stop Rhogar while she complete the teleportation circle, giving Mira permission to use Rhogar's wealth to obtain supplies.
While the Sable Warden worked on reconstructing the circle, Mira collected 180 gold pieces from the house and picked up a gold candlestick for good measure, then he and Anrel visited [[Tiaathque's Medicinal Remedies]] to gather supplies. The Sable Warden answered questions from Grokko by explaining some of Kaarst's and the [[Raven Queen]]'s histories, as well as the nature of gods and the dangers of arcane magic.
When Anrel, Mira and Grimm joined them at Rhogar's house, the Sable Warden used the spell scroll to teleport the party to wherever the circle lead, which turned out to be the [[Acropolis of Kereskaa]].
{{Locations}}
[[Category:Residences]]
42864eaa0e5a3dbb39310b7be319c0604ce617a9
Ingen's invisibility potion
0
327
579
2024-04-28T14:27:02Z
Vicht
1
Created page with "In the caves on the [[Zaheer island|island]] used by [[gnoll]]s to summon [[demon]]s, the party wandered into a chamber filled the bones of people who died violently, presumably those killed by the wolf demon. [[Anrel]] found a [[Ingen's satchel|satchel]] that he recognized as having belonged to [[Ingen Persson]], a soldier formerly under his command who he'd believed died [[Ùrlar Valley|seven years earlier]]. Inside the satchel, Anrel found items that he also recognize..."
wikitext
text/x-wiki
In the caves on the [[Zaheer island|island]] used by [[gnoll]]s to summon [[demon]]s, the party wandered into a chamber filled the bones of people who died violently, presumably those killed by the wolf demon. [[Anrel]] found a [[Ingen's satchel|satchel]] that he recognized as having belonged to [[Ingen Persson]], a soldier formerly under his command who he'd believed died [[Ùrlar Valley|seven years earlier]]. Inside the satchel, Anrel found items that he also recognized as belonging to <b>Ingen</b>: a [[Ingen's journal|leatherbound journal]], a [[Ingen's thieves' tools|set of thieves' tools]], and a vial of nearly transparent liquid, all of which Anrel picked up.
While hiding from ape-bodied, bat-faced, boar-sounding demons behind an [[Silent Image|illusory]] rockface cast by [[Grokko]], Anrel used a taste test to identify the transparent liquid as a <b>potion of invisibility</b>.
Not long thereafter, Grokko consumes the potion to scout the entire north-western wing of the temple of [[Zaheer]]. He almost immediately steps on a pressure tile that activates a poison dart that strikes him, making [[Vichthart]] believe Grokko is in danger (due to their [[Warding Bond]]). Vichthart and Anrel rush to Grokko's aid, which annoys Grokko because it needlessly squanders the stealth they were aiming for.
After Grokko confirms he's safe, he continues scouting, and fortunately the misunderstanding doesn't seem to have alerted anything to their presence. He follows corridors to locate the last two [[throat]] rooms as well as a jail holding several captives (including [[Celia]] and [[Preston]]).
{{Items}}
[[Category:Potions]]
[[Category:Items held by Anrel]]
aef59812b4f063963b33da2740111a994b0e11c5
580
579
2024-04-28T14:33:55Z
Vicht
1
Added Category:Items previously held by Ingen Persson
wikitext
text/x-wiki
In the caves on the [[Zaheer island|island]] used by [[gnoll]]s to summon [[demon]]s, the party wandered into a chamber filled the bones of people who died violently, presumably those killed by the wolf demon. [[Anrel]] found a [[Ingen's satchel|satchel]] that he recognized as having belonged to [[Ingen Persson]], a soldier formerly under his command who he'd believed died [[Ùrlar Valley|seven years earlier]]. Inside the satchel, Anrel found items that he also recognized as belonging to <b>Ingen</b>: a [[Ingen's journal|leatherbound journal]], a [[Ingen's thieves' tools|set of thieves' tools]], and a vial of nearly transparent liquid, all of which Anrel picked up.
While hiding from ape-bodied, bat-faced, boar-sounding demons behind an [[Silent Image|illusory]] rockface cast by [[Grokko]], Anrel used a taste test to identify the transparent liquid as a <b>potion of invisibility</b>.
Not long thereafter, Grokko consumes the potion to scout the entire north-western wing of the temple of [[Zaheer]]. He almost immediately steps on a pressure tile that activates a poison dart that strikes him, making [[Vichthart]] believe Grokko is in danger (due to their [[Warding Bond]]). Vichthart and Anrel rush to Grokko's aid, which annoys Grokko because it needlessly squanders the stealth they were aiming for.
After Grokko confirms he's safe, he continues scouting, and fortunately the misunderstanding doesn't seem to have alerted anything to their presence. He follows corridors to locate the last two [[throat]] rooms as well as a jail holding several captives (including [[Celia]] and [[Preston]]).
{{Items}}
[[Category:Potions]]
[[Category:Items held by Anrel]]
[[Category:Items previously held by Ingen Persson]]
280a0cd4f1e7addced79c570d7cd7a78956c2ad1
Ingen's thieves' tools
0
328
581
2024-04-28T14:51:12Z
Vicht
1
Created page with "In the caves on the [[Zaheer island|island]] used by [[gnoll]]s to summon [[demon]]s, the party wandered into a chamber filled the bones of people who died violently, presumably those killed by the wolf demon. [[Anrel]] found a [[Ingen's satchel|satchel]] that he recognized as having belonged to [[Ingen Persson]], a soldier formerly under his command who he'd believed died [[Ùrlar Valley|seven years earlier]]. Inside the satchel, Anrel found items that he also recognize..."
wikitext
text/x-wiki
In the caves on the [[Zaheer island|island]] used by [[gnoll]]s to summon [[demon]]s, the party wandered into a chamber filled the bones of people who died violently, presumably those killed by the wolf demon. [[Anrel]] found a [[Ingen's satchel|satchel]] that he recognized as having belonged to [[Ingen Persson]], a soldier formerly under his command who he'd believed died [[Ùrlar Valley|seven years earlier]]. Inside the satchel, Anrel found items that he also recognized as belonging to <b>Ingen</b>: a [[Ingen's journal|leatherbound journal]], a <b>set of thieves' tools</b>, and a [[Ingen's invisibility potion|vial of nearly transparent liquid]], all of which Anrel picked up.
On 18 Thelliea, Anrel awoke in the [[house of healing]] after a full two days' unconscious recovery from his fight against the [[bone devil]] and the divine intervention of [[Zaheer]]. He held a lengthy conversation with [[Cardinal Maurul Silkendawn]]. When the Cardinal expressed doubt that Anrel had actually been searching for his missing platoon, Anrel showed him the journal, the thieves' tools and a [[demon bone]] Anrel had taken from the same chamber. Until he looked at the journal more carefully, the Cardinal dismissed the items as ‘A book, a bone and a lockpick?’
{{Items}}
[[Category:Tools]]
[[Category:Items held by Anrel]]
[[Category:Items previously held by Ingen Persson]]
3402d40125120b7c36b019b49175a90f74ac9747
Template:Items
10
329
582
2024-04-28T23:28:21Z
Vicht
1
Created page with "{{Navbox | state = plain | listclass = hlist | title = Items | group1 = Party | list1 = * [[Spell scroll of Banishment]] * [[Waterproof clothing]] * [[Peach-sized ruby]] * [[Suithrathus Luirmo]] * [[Potion of Animal Friendship]] * [[Drift globe]] * [[Crossbow bolt]]s * [[Augury bones]] * [[Charred spell scroll of Expeditious Retreat]] * [[Charred spell scroll of False Life]] * [[Charred spell scroll of Featherfall]] * [[Potion of invisibility]] * [[Crystal ball]] {{Nav..."
wikitext
text/x-wiki
{{Navbox
| state = plain
| listclass = hlist
| title = Items
| group1 = Party
| list1 =
* [[Spell scroll of Banishment]]
* [[Waterproof clothing]]
* [[Peach-sized ruby]]
* [[Suithrathus Luirmo]]
* [[Potion of Animal Friendship]]
* [[Drift globe]]
* [[Crossbow bolt]]s
* [[Augury bones]]
* [[Charred spell scroll of Expeditious Retreat]]
* [[Charred spell scroll of False Life]]
* [[Charred spell scroll of Featherfall]]
* [[Potion of invisibility]]
* [[Crystal ball]]
{{Navbox|child
| group2 = [[:Category:Items held by Anrel|Anrel]]
| list2 =
* [[Anrel's plate armour|Plate armour]]
* [[Demon tooth]]
* [[Seal|Seal of Illusion]]
* [[Black hair dye]]
* [[Badge of the Platinum Dragon]]
{{Navbox|child
| group3 = [[:Category:Items previously held by Ingen Persson|Ingen's satchel]]
| list3 =
* [[Ingen's journal]]
* [[Ingen's thieves' tools]]
* [[Chime of Opening]]
| group4 = Weapons
| list4 =
* [[Anrel's greatsword|Greatsword]]
* [[Anrel's whip|Whip]]
* [[Anrel's glaive|Glaive]]
* [[Anrel's old sword|Old sword]]
| group5 = Consumed
| list5 =
* [[Ring of Lehman’s Tiny Hut]]
* [[Potion of frost giant strength]]
* [[Ingen's invisibility potion]]
* [[Spell scroll of Lightning Lure]]
}} <!-- End of Anrel -->
| group6 = [[:Category:Items held by Grokko|Grokko]]
| list6 =
* [[Potion of gaseous form]]
* [[Carved bones]]
* [[Grokko's battleaxe|Battleaxe]]
* [[Pearl of Power]]
* [[Feywild Shard]]
* [[Obsidian shard]]
* [[Fey apple]]
* [[Ordered potion of healing]]
* [[Obsidian Claw]]
* [[Kobolwitz key]]
* [[Certificate of procurement]]
* [[Detlef's journal]]
* [[Vial of magical conduit]]
{{Navbox|child
| group7 = Worn
| list7 =
* [[Fine shirt]]
* [[Ascot]]
* [[Symbol of Bane]]
* [[Platinum ring]]
* [[Ring of Poison Resistance]]
}} <!-- End of Grokko -->
| group8 = [[:Category:Items held by Mira|Mira]]
| list8 =
* [[Mira's daggers|Daggers]]
* [[Mira's crowbar|Crowbar]]
* [[Mira's robes|Robes]]
* [[Mira's shirt|Shirt]]
* [[Mira's armour|Armour]]
* [[Mira's thieves' tools|Thieves' tools]]
* [[Brewing supplies]]
* [[Apple]]
* [[Gold candlestick]]
* [[Fancy pen]]
* [[Book of the Twinned Flame]]
* [[Pearl]]
* [[Diamond]]s
* [[Erinyes feather]]
* [[Etorn's pocketwatch]]
{{Navbox|child
| group9 = Preserves
| list9 =
* [[Strawberry jam]]
* [[Tainted strawberry jam]]
* [[Snozberry jam]]
* [[Pickled onions]]
* [[Lemon curd]]
| group10 = Arcane
| list10 =
* [[Truth serum]]
* [[Devil blood ink]]
* [[Ashfire oil]]
* [[Weird vial]]
* [[Emerald pen]]
* [[Potion of mind reading]]
* [[Arcane Grimoire]]
}} <!-- End of Mira -->
| group11 = [[:Category:Items held by Vichthart|Vichthart]]
| list11 =
* [[Stone of Far Speech]]
* [[Bag of ruby beads]]
* [[Gold ring]]
* [[Vichthart's blanket|Blanket]]
* [[Emerald]]
* [[Jar of lemon curd]]
* [[Flat-bottomed ruby]]
* [[Kobolwitz medicine]]
* [[Oil of Etherealness]]
{{Navbox|child
| group12 = Worn
| list12 =
* [[Vichthart's scale mail|Scale mail]]
* [[Periapt of Wound Closure]]
* [[Platinum ring]]
* [[Vichthart's shield|Shield]]
* [[Spiderweb shield]]
| group13 = Weapons
| list13 =
* [[Vichthart's mace|Mace]]
* [[Vichthart's crossbow|Crossbow]]
* [[Vichthart's dagger|Silvered dagger]]
| group14 = Written
| list14 =
* [[Journal of Rrekkeh Stormcrawler]]
* [[Kobolwitz prescription]]
* [[Note of authority]]
* [[Kaarst City Watch incident reports]]
* [[Writ of passage]]
* [[C.B.L. invoice]]
* [[Kobolwitz Manor Tide note]]
* [[Tide invitation]]
}} <!-- End of Vichthart -->
| group15 = [[:Category:Items in the Bag of Holding|Bag of Holding]]
| list15 =
* [[Set of silverware]]
* [[Pair of bone dice]]
* [[Black pearl]]
* [[Harp]]
* [[Magic beads]]
* [[Alchemy jug]]
* [[Eldritch Claw]]
* [[Flasks of blood]]
* [[Spell scroll of Far Step]]
* [[Journal of Irann Rhogar]]
* [[Sphere of thick glass]]
* [[Vial of magical conduit]]
* [[Leatherbound books]]
}} <!-- End of Party -->
}} <!-- End -->
d9661834b05c9354c6a7af065f0cbdabe88cd749
599
582
2024-04-29T16:44:45Z
Vicht
1
Moved Spell scroll of Banishment from Party to Vichthart Written
wikitext
text/x-wiki
{{Navbox
| state = plain
| listclass = hlist
| title = Items
| group1 = Party
| list1 =
* [[Waterproof clothing]]
* [[Peach-sized ruby]]
* [[Suithrathus Luirmo]]
* [[Potion of Animal Friendship]]
* [[Drift globe]]
* [[Crossbow bolt]]s
* [[Augury bones]]
* [[Charred spell scroll of Expeditious Retreat]]
* [[Charred spell scroll of False Life]]
* [[Charred spell scroll of Featherfall]]
* [[Potion of invisibility]]
* [[Crystal ball]]
{{Navbox|child
| group2 = [[:Category:Items held by Anrel|Anrel]]
| list2 =
* [[Anrel's plate armour|Plate armour]]
* [[Demon tooth]]
* [[Seal|Seal of Illusion]]
* [[Black hair dye]]
* [[Badge of the Platinum Dragon]]
{{Navbox|child
| group3 = [[:Category:Items previously held by Ingen Persson|Ingen's satchel]]
| list3 =
* [[Ingen's journal]]
* [[Ingen's thieves' tools]]
* [[Chime of Opening]]
| group4 = Weapons
| list4 =
* [[Anrel's greatsword|Greatsword]]
* [[Anrel's whip|Whip]]
* [[Anrel's glaive|Glaive]]
* [[Anrel's old sword|Old sword]]
| group5 = Consumed
| list5 =
* [[Ring of Lehman’s Tiny Hut]]
* [[Potion of frost giant strength]]
* [[Ingen's invisibility potion]]
* [[Spell scroll of Lightning Lure]]
}} <!-- End of Anrel -->
| group6 = [[:Category:Items held by Grokko|Grokko]]
| list6 =
* [[Potion of gaseous form]]
* [[Carved bones]]
* [[Grokko's battleaxe|Battleaxe]]
* [[Pearl of Power]]
* [[Feywild Shard]]
* [[Obsidian shard]]
* [[Fey apple]]
* [[Ordered potion of healing]]
* [[Obsidian Claw]]
* [[Kobolwitz key]]
* [[Certificate of procurement]]
* [[Detlef's journal]]
* [[Vial of magical conduit]]
{{Navbox|child
| group7 = Worn
| list7 =
* [[Fine shirt]]
* [[Ascot]]
* [[Symbol of Bane]]
* [[Platinum ring]]
* [[Ring of Poison Resistance]]
}} <!-- End of Grokko -->
| group8 = [[:Category:Items held by Mira|Mira]]
| list8 =
* [[Mira's daggers|Daggers]]
* [[Mira's crowbar|Crowbar]]
* [[Mira's robes|Robes]]
* [[Mira's shirt|Shirt]]
* [[Mira's armour|Armour]]
* [[Mira's thieves' tools|Thieves' tools]]
* [[Brewing supplies]]
* [[Apple]]
* [[Gold candlestick]]
* [[Fancy pen]]
* [[Book of the Twinned Flame]]
* [[Pearl]]
* [[Diamond]]s
* [[Erinyes feather]]
* [[Etorn's pocketwatch]]
{{Navbox|child
| group9 = Preserves
| list9 =
* [[Strawberry jam]]
* [[Tainted strawberry jam]]
* [[Snozberry jam]]
* [[Pickled onions]]
* [[Lemon curd]]
| group10 = Arcane
| list10 =
* [[Truth serum]]
* [[Devil blood ink]]
* [[Ashfire oil]]
* [[Weird vial]]
* [[Emerald pen]]
* [[Potion of mind reading]]
* [[Arcane Grimoire]]
}} <!-- End of Mira -->
| group11 = [[:Category:Items held by Vichthart|Vichthart]]
| list11 =
* [[Stone of Far Speech]]
* [[Bag of ruby beads]]
* [[Gold ring]]
* [[Vichthart's blanket|Blanket]]
* [[Emerald]]
* [[Jar of lemon curd]]
* [[Flat-bottomed ruby]]
* [[Kobolwitz medicine]]
* [[Oil of Etherealness]]
{{Navbox|child
| group12 = Worn
| list12 =
* [[Vichthart's scale mail|Scale mail]]
* [[Periapt of Wound Closure]]
* [[Platinum ring]]
* [[Vichthart's shield|Shield]]
* [[Spiderweb shield]]
| group13 = Weapons
| list13 =
* [[Vichthart's mace|Mace]]
* [[Vichthart's crossbow|Crossbow]]
* [[Vichthart's dagger|Silvered dagger]]
| group14 = Written
| list14 =
* [[Journal of Rrekkeh Stormcrawler]]
* [[Spell scroll of Banishment]]
* [[Kobolwitz prescription]]
* [[Note of authority]]
* [[Kaarst City Watch incident reports]]
* [[Writ of passage]]
* [[C.B.L. invoice]]
* [[Kobolwitz Manor Tide note]]
* [[Tide invitation]]
}} <!-- End of Vichthart -->
| group15 = [[:Category:Items in the Bag of Holding|Bag of Holding]]
| list15 =
* [[Set of silverware]]
* [[Pair of bone dice]]
* [[Black pearl]]
* [[Harp]]
* [[Magic beads]]
* [[Alchemy jug]]
* [[Eldritch Claw]]
* [[Flasks of blood]]
* [[Spell scroll of Far Step]]
* [[Journal of Irann Rhogar]]
* [[Sphere of thick glass]]
* [[Vial of magical conduit]]
* [[Leatherbound books]]
}} <!-- End of Party -->
}} <!-- End -->
dcd7b837993a9669f65c0cc1024bfbff8ee00331
Items
0
330
583
2024-04-28T23:28:36Z
Vicht
1
Created page with "{{Items}}"
wikitext
text/x-wiki
{{Items}}
bdef4845893ba2d032536d4f78e3e1e09955decb
Main Page
0
1
584
255
2024-04-28T23:28:51Z
Vicht
1
wikitext
text/x-wiki
{{Characters}}
{{Locations}}
{{Items}}
dcccdb78780264620b3b1d125eb96aa63f7344d4
Notes:Kaarst City Watch Eurgaran Wihta incident report
100
331
585
2024-04-28T23:33:22Z
Vicht
1
Created page with "Incident Report<br> Date of report:<br> 17th Thirkuoss<br> Location:<br> Harbour (Mastaff Ward) Nature of crime:<br> Murder Victim(s):<br> Name: Eurgaran Wihta<br> Description: half-elf man<br> Occupation: dockworker, volunteer at Squall’s Beacon Details:<br> Euragan reported missing by his wife Heda Wihta early morning 16th Thirkuoss. Wihta last seen by wife leaving home to work and leave offering at Squall’s Beacon the previous evening (15th Thirkuoss). Inter..."
wikitext
text/x-wiki
Incident Report<br>
Date of report:<br>
17th Thirkuoss<br>
Location:<br>
Harbour (Mastaff Ward)
Nature of crime:<br>
Murder
Victim(s):<br>
Name: Eurgaran Wihta<br>
Description: half-elf man<br>
Occupation: dockworker, volunteer at Squall’s Beacon
Details:<br>
Euragan reported missing by his wife Heda Wihta early morning 16th Thirkuoss.
Wihta last seen by wife leaving home to work and leave offering at Squall’s Beacon the previous evening (15th Thirkuoss).
Interviewed Eldon Garrick, volunteer at Squall’s Beacon working on night of 15th Thirkuoss. Wihta did not attend on 15th Thirkuoss, with Garrick left to carry out duties alone.
17th Thirkuoss – corpse found floating in harbour early morning by group of dockworkers and reported to city watch. Identified by clothing as Eurgaran Wihta, confirmed by Heda Wihta.
Inspection of corpse suggests Wihta was savaged by some kind of animal – multiple wounds suggestive of teeth and claws all over body, including limbs, torso and head. Several fingers also missing. Body also suffered severe physical trauma evidenced by several broken bones, suggesting a fall from great height. Exact cause of death difficult to determine due to decomposition and water damage.
Investigation ongoing.
94541da8cc4b68f4c22f35df5cb9ae47f8f06743
Notes:Kaarst City Watch Thodris Holderhek incident report
100
332
586
2024-04-28T23:34:08Z
Vicht
1
Created page with "Incident Report<br> Date of report:<br> 10th Thirkuoss Location:<br> Sombre Lyceum Nature of crime:<br> Murder Victim(s):<br> Name: Thodris Holderhek<br> Description: dwarf woman<br> Occupation: groundskeeper, Sombre Lyceum Details:<br> Body discovered early morning on 10th Thirkuoss by mourners visiting the Sombre Lyceum. Body was found lying at the base of statue of the Raven Queen on the east side of the Lyceum. Body was arranged in a pose mimicking the statue’..."
wikitext
text/x-wiki
Incident Report<br>
Date of report:<br>
10th Thirkuoss
Location:<br>
Sombre Lyceum
Nature of crime:<br>
Murder
Victim(s):<br>
Name: Thodris Holderhek<br>
Description: dwarf woman<br>
Occupation: groundskeeper, Sombre Lyceum
Details:<br>
Body discovered early morning on 10th Thirkuoss by mourners visiting the Sombre Lyceum.
Body was found lying at the base of statue of the Raven Queen on the east side of the Lyceum. Body was arranged in a pose mimicking the statue’s, indicating intentional placement.
Apparent cause of death was multiple wounds sustained from teeth and/or claws in various places on body. Trail of blood was found leading from the body to an area close by where spilled blood and signs of struggle were found, suggesting Holderhek had been attacked in this area and then her body carried to the statue. Statue was defaced with blood.
Holderhek was a groundskeeper of the Sombre Lyceum in the employ of the Kade Sirrine Kathedrale, with clergy officials stating that she would usually work in the evenings. She was noted to be a dedicated worker, and was known to worship the Raven Queen.
Investigation ongoing.
45fde0e9d86d6a56322c9a13aeb05a2230fe2082
Notes:Kaarst City Watch Reginald Kobolwitz incident report
100
333
587
2024-04-28T23:34:43Z
Vicht
1
Created page with "Incident Report<br> Date of report:<br> 3rd Thirkuoss Location:<br> Kobolwitz Manor Nature of crime:<br> Murder Victim(s):<br> Name: Ser Reginald Kobolwitz<br> Description: human man, late 50s, average height, blue eyes, short grey hair with moustache<br> Occupation: Retired, former explorer Details:<br> Body was discovered on the morning of 3rd Thirkuoss by housekeeper Claira Hanali, who reported incident to the city watch. Hanali reports that she had entered the ma..."
wikitext
text/x-wiki
Incident Report<br>
Date of report:<br>
3rd Thirkuoss
Location:<br>
Kobolwitz Manor
Nature of crime:<br>
Murder
Victim(s):<br>
Name: Ser Reginald Kobolwitz<br>
Description: human man, late 50s, average height, blue eyes, short grey hair with moustache<br>
Occupation: Retired, former explorer
Details:<br>
Body was discovered on the morning of 3rd Thirkuoss by housekeeper Claira Hanali, who reported incident to the city watch. Hanali reports that she had entered the manor that morning to begin her work duties after having been away visiting family in Salzreich for three weeks. Hanali notes that Ser Kobolwitz refused to employ a temporary replacement while she was away, insisting that he would be able to manage in her absence.
Ser Kobolwitz’ body was found in the manor’s drawing room consistent with Hanali’s description. Body was lying on floor surrounded by a large pool of dried blood. Source of blood appears to be primarily from large neck wound, with additional wounds sustained to chest and stomach. All wounds seem to be consistent with teeth and claws of some kind of predatory animal.
The blood surrounding the body had dried completely, and condition of body, and the body was in an early state of decay, both suggesting Ser Kobolwtiz had been killed some days ago. Most of the blood found at the scene was confined to the area surrounding the body, suggesting that the attack had taken place in the room and the body had fallen close to where the attack took place. Blood was found on the body’s hands, suggesting Ser Kobolwitz had attempted to staunch his wounds before losing consciousness.
The surroundings of the drawing room showed signs of a brief struggle, with two chairs knocked over along with an upturned table with the broken remains of a bottle of wine and wine glasses nearby. Fireplace contained only a small amount of ashes, suggesting fire had been lit and had been left to burn itself out without additional fuel being added.
There were no signs of forced entry found anywhere on the manor premises during investigation, suggesting culprit was able to enter and exit freely. All outside doors and windows were locked. It is possible that culprit used magic to enter and/or escape.
Additionally, no evidence could be found of any theft from the premises – housekeeper assisted city watch in search of any missing property, but nothing was found to be unaccounted for.
There have been no recent reports of suspicious activity in the vicinity of Kobolwitz Manor.
Investigation ongoing.
60ea37fa82de0c52fe97beab6d4a55217550ae2f
Notes:Kaarst City Watch Hope's Prize incident report
100
334
588
2024-04-28T23:35:30Z
Vicht
1
Created page with "Incident report<br> Date of report:<br> 25th Skaerentsa Location:<br> Incident took place on board the ship Hope’s Prize, which was docked in Kaarst harbour at the time Nature of crime:<br> Murder, smuggling of arcane contraband Victim(s):<br> Name: Adran Mokam<br> Description: Human man<br> Occupation: sailor – captain of the ship Hope’s Prize Name: Thava Windreaver<br> Description: Halfling woman<br> Occupation: sailor – bosun of the ship Hope’s Prize De..."
wikitext
text/x-wiki
Incident report<br>
Date of report:<br>
25th Skaerentsa
Location:<br>
Incident took place on board the ship Hope’s Prize, which was docked in Kaarst harbour at the time
Nature of crime:<br>
Murder, smuggling of arcane contraband
Victim(s):<br>
Name: Adran Mokam<br>
Description: Human man<br>
Occupation: sailor – captain of the ship Hope’s Prize
Name: Thava Windreaver<br>
Description: Halfling woman<br>
Occupation: sailor – bosun of the ship Hope’s Prize
Details:<br>
Incident was reported by crew of the Hope’s Prize who discovered the bodies early morning. No witnesses of the attack taking place – most crew were off ship cavorting in city and returned to the ship drunk to rest.
Both victims were found on a ship that had recently made port. The pair were sailors of some experience who often traded goods around the Roughspun Coast.
They were found in their ship’s lower deck, with signs of a struggle. Both had received several wounds from blades, likely daggers, and had sustained wounds consistent with cold and necrotic damage. Patches of frost and ice were also found in the surrounding room, with no apparent source.
The nature of several wounds and surrounding damage suggests arcane intervention.
When the scene of the crime was searched, city watch discovered several items of magical contraband – a spell scroll of firebolt, an enchanted dagger, and several materials consistent with the material components of arcane spells. Material has been confiscated and the Hope’s Prize has been temporarily retained pending further investigation.
Investigation ongoing.
b38e935badace173c8c9c0713a7922dba6603dd9
Notes:Kaarst City Watch Traulam Eugen incident report
100
335
589
2024-04-28T23:36:15Z
Vicht
1
Created page with "Incident Report<br> Date of report:<br> 20th Maneseed Location:<br> Unknown – victim had been residing in private quarters in Kade Sirrine Kathedrale Nature of crime:<br> Missing person – possible kidnapping or murder Victim(s):<br> Name: Traulam Eugen<br> Description: Human man, 47 years, brown eyes, short with slim build, shaved head with dark goatee<br> Occupation: Priest (follower of Bahamut) – Church of St Anarad, Senneborn Details:<br> City watch contacte..."
wikitext
text/x-wiki
Incident Report<br>
Date of report:<br>
20th Maneseed
Location:<br>
Unknown – victim had been residing in private quarters in Kade Sirrine Kathedrale
Nature of crime:<br>
Missing person – possible kidnapping or murder
Victim(s):<br>
Name: Traulam Eugen<br>
Description: Human man, 47 years, brown eyes, short with slim build, shaved head with dark goatee<br>
Occupation: Priest (follower of Bahamut) – Church of St Anarad, Senneborn
Details:<br>
City watch contacted by officials of the Kade Sirrine Kathedrale on morning of 20th Maneseed, and were informed that Traulam Eugen had not returned to his place of residence within the cathedral’s private quarters as expected the previous night and there were concerns for his safety.
Eugen typically resides in Senneborn, but was recently invited to Kaarst by Cardinal Silkendawn.
Description of Eugen circulated to city watch, patrols advised to be on the lookout for anyone matching his description. Any sightings are to be reported immediately to captain Teinithra directly.
Investigation ongoing.
51cfd611c977b1ae363193e44614ca286d940276
Notes:Kaarst City Watch Felosial Teinithra incident report
100
336
590
2024-04-28T23:37:02Z
Vicht
1
Created page with "Incident Report<br> Date of report:<br> 4th Thelliea Location: Nature of crime:<br> Assault and kidnapping Victim(s):<br> Name: Felosial Teinithra<br> Description: human man, middle-aged, shaved head<br> Occupation: captain, Kaarst city watch Details:<br> Incident occurred at some time late night on 3rd Thelliea. Incident was reported early morning by Sgt. Doudra who was lightly wounded and knocked unconscious during incident. During patrol of Ravensfair, Cpt. Teini..."
wikitext
text/x-wiki
Incident Report<br>
Date of report:<br>
4th Thelliea
Location:
Nature of crime:<br>
Assault and kidnapping
Victim(s):<br>
Name: Felosial Teinithra<br>
Description: human man, middle-aged, shaved head<br>
Occupation: captain, Kaarst city watch
Details:<br>
Incident occurred at some time late night on 3rd Thelliea. Incident was reported early morning by Sgt. Doudra who was lightly wounded and knocked unconscious during incident.
During patrol of Ravensfair, Cpt. Teinithra and Sgt. Doudra split from rest of patrol group in order to more quickly cover narrower side streets.
The patrol heard a voice calling to them from an alleyway and investigated. One unknown individual described as wearing a hooded cloak was present in alleyway, apparently injured and bleeding.
When Teinithra and Doudra approached the individual, Doudra reported hearing something behind her, whereupon she was struck several times by force from behind and lost consciousness.
Doudra reports regaining consciousness alone in alleyway, with no sign of Teinithra, hooded individual or unknown assailant.
Doudra’s wounds were inspected and cleaned. Wounds were non-lethal but very damaging. Wounds inflicted include multiple bites to right shoulder, and deep cuts across back. Aggressive nature of wounds suggests inflicted by teeth and claws of a predatory animal.
Later inspection of alleyway where incident took place shows clear signs of a struggle, with disturbed dirt on ground indicating one body being dragged through alleyway. Blood was also found in alleyway, amount consistent with wounds sustained by Doudra, suggesting neither Teinithra nor assailants were significantly wounded during incident.
Investigation ongoing.
cdb9ce53aaa76058e0637686f96ebe002984e16c
Kaarst City Watch incident reports
0
337
592
2024-04-29T00:05:50Z
Vicht
1
Created page with "On [[Timeline|12 Thelliea]], [[Vichthart]] and [[Grokko]] returned to [[Kade Sirrine Kathedrale]] to inspect the bodies of Eurgaran Wihta, Thodris Holderhek and Ser Reginald Kobolwitz while [[Anrel]] and [[Mira]] visited the [[Sombre Lyceum]] to investigate the location where Thodris Holderhek was murdered. [[Sable Warden Meriele Berevan]] led them down to the catacombs where the bodies were being kept. While there, they were provided with copies of [[Kaarst City Watch]..."
wikitext
text/x-wiki
On [[Timeline|12 Thelliea]], [[Vichthart]] and [[Grokko]] returned to [[Kade Sirrine Kathedrale]] to inspect the bodies of Eurgaran Wihta, Thodris Holderhek and Ser Reginald Kobolwitz while [[Anrel]] and [[Mira]] visited the [[Sombre Lyceum]] to investigate the location where Thodris Holderhek was murdered.
[[Sable Warden Meriele Berevan]] led them down to the catacombs where the bodies were being kept. While there, they were provided with copies of [[Kaarst City Watch]]'s incident reports on all the crimes that Vichthart had been summoned to [[Kaarst]] to investigate.
== <i class="ship">Hope's Prize</i> ==
The earliest of the crimes under investigation. Co-owners of the ship <i class="ship">[[Hope's Prize]]</i> [[human]] man Captain [[Adran Mokam]] and [[halfling]] woman boatswain [[Thava Windreaver]] were found dead on board, with evidence of smuggling on the ship.
<blockquote>
{{Notes:Kaarst City Watch Hope's Prize incident report}}
</blockquote>
== Father Traulam Eugen ==
[[Cardinal Maurul Silkendawn]] invited human man [[Father Traulam Eugen]], priest at the [[Church of St Anarad]] in [[Senneborn]] and an acquaintance of Vichthart, to Kaarst. He didnt return to his quarters in Kade Sirrine Kathedrale one evening.
<blockquote>
{{Notes:Kaarst City Watch Traulam Eugen incident report}}
</blockquote>
== Ser Reginald Kobolwitz ==
Housekeeper [[Claira Hanali]] discovered the body of [[Ser Reginald Kobolwitz]] in [[Kobolwitz Manor]], his body seemingly murdered several days beforehand.
<blockquote>
{{Notes:Kaarst City Watch Reginald Kobolwitz incident report}}
</blockquote>
== Thodris Holderhek ==
[[Dwarf]] woman [[Thodris Holderhek]] was a groundkeeper at the [[Sombre Lyceum]], discovered murdered under a statue of the [[Raven Queen]].
<blockquote>
{{Notes:Kaarst City Watch Thodris Holderhek incident report}}
</blockquote>
== Eurgaran Wihta ==
[[Half-elf]] man [[Eurgaran Wihta]] was reported missing by his wife [[Heda Wihta|Heda]], his co-volunteer [[Eldon Garrick]] claimed he never arrived at [[Squall's Beacon]] the night before. His body was found in the harbour the following day.
<blockquote>
{{Notes:Kaarst City Watch Eurgaran Wihta incident report}}
</blockquote>
== Captain Felosial Teinithra ==
Human man [[Felosial Teinithra]] was Captain of [[Kaarst City Watch]], and was last seen patrolling [[Ravensfair]] with [[Sergeant Therai Doudra]], who claimed they were attacked in an alley.
<blockquote>
{{Notes:Kaarst City Watch Felosial Teinithra incident report}}
</blockquote>
{{Items}}
[[Category:Written items]]
[[Category:Items held by Vichthart]]
690c36cf752844e860b3c95f16a2a565f57527d9
Stone of Far Speech
0
338
593
2024-04-29T01:04:15Z
Vicht
1
Created page with "On [[Timeline|29 Thirkuoss]], the party killed [[Srir Silthallow]] by the altar to [[Zaheer]] at the top of the mountain on the [[Zaheer island|island]] where [[Rrekkeh Stormcrawler]] had convinced a pack of [[gnoll]]s to begin summoning [[demon]]s. When [[Szehga]] searched her sister's body, she found a small red stone she didn't recognize, claiming she must have picked it up after leaving their home lands. She handed it to [[Vichthart]] who recognized it as a single [..."
wikitext
text/x-wiki
On [[Timeline|29 Thirkuoss]], the party killed [[Srir Silthallow]] by the altar to [[Zaheer]] at the top of the mountain on the [[Zaheer island|island]] where [[Rrekkeh Stormcrawler]] had convinced a pack of [[gnoll]]s to begin summoning [[demon]]s.
When [[Szehga]] searched her sister's body, she found a small red stone she didn't recognize, claiming she must have picked it up after leaving their home lands. She handed it to [[Vichthart]] who recognized it as a single [[Stone of Far Speech]]. He disclosed its existence to [[Father Eivald Glissan]], who instructed him to submit it with his full report when he returns to [[Hellenhelm]] after completing his current assignment in [[Kaarst]].
{{Items}}
[[Category:Items held by Vichthart]]
1e320912bbd5c61774d73065ae86f28929e5c54e
Vichthart's blanket
0
339
594
2024-04-29T01:12:39Z
Vicht
1
Created page with "On [[Timeline|29 Thirkuoss]], the party killed [[Srir Silthallow]] by the altar to [[Zaheer]] at the top of the mountain on the [[Zaheer island|island]] where [[Rrekkeh Stormcrawler]] had convinced a pack of [[gnoll]]s to begin summoning [[demon]]s. In the hands of a woman lying dead on that altar having been dragged from the slave village two days before was a colourful crystal only much later identified as a [[Feywild Shard]]. [[Grokko]] heard a fine ringing coming fr..."
wikitext
text/x-wiki
On [[Timeline|29 Thirkuoss]], the party killed [[Srir Silthallow]] by the altar to [[Zaheer]] at the top of the mountain on the [[Zaheer island|island]] where [[Rrekkeh Stormcrawler]] had convinced a pack of [[gnoll]]s to begin summoning [[demon]]s.
In the hands of a woman lying dead on that altar having been dragged from the slave village two days before was a colourful crystal only much later identified as a [[Feywild Shard]]. [[Grokko]] heard a fine ringing coming from the shard which gave him a headache, and fearing the effect this might have on him, [[Vichthart]] wrapped it in his <b>blanket</b> to dampen the noise. He then placed it in Grokko's [[Bag of Holding]] where it became inaudible to Grokko.
On 15 Thelliea, while fighting the [[bone devil]] in a cavern beneath [[Kade Sirrine Kathedrale]], both [[Anrel]] and [[Grokko]] ended up diving off the edge of a pile of rock debris and into fast flowing waters. In an attempt to help them climb out, Vichthart threw his blanket down the side of the debris.
Anrel acquired wings of lightning for a brief period, which he used to fly himself and Grokko out of the water, making the blanket useless.
{{Items}}
[[Category:Items held by Vichthart]]
f6ab778a36fea29ef4abdcbc52b32d6d818a5f8c
Gold ring
0
340
595
2024-04-29T15:48:16Z
Vicht
1
Created page with "On [[Timeline|29 Thirkuoss]], the party killed [[Srir Silthallow]] by the altar to [[Zaheer]] at the top of the mountain on the [[Zaheer island|island]] where [[Rrekkeh Stormcrawler]] had convinced a pack of [[gnoll]]s to begin summoning [[demon]]s. Before returning to the slave village, they and [[Szehga]] agreed they should destroy any remaining demons they could find. After patrolling the cave system in the mountain, they were unable to find any demons remaining, and..."
wikitext
text/x-wiki
On [[Timeline|29 Thirkuoss]], the party killed [[Srir Silthallow]] by the altar to [[Zaheer]] at the top of the mountain on the [[Zaheer island|island]] where [[Rrekkeh Stormcrawler]] had convinced a pack of [[gnoll]]s to begin summoning [[demon]]s.
Before returning to the slave village, they and [[Szehga]] agreed they should destroy any remaining demons they could find. After patrolling the cave system in the mountain, they were unable to find any demons remaining, and concluded they must have already demanifested from the [[material plane]] due to the defeat of Srir, Rrekkeh and their cultists.
While checking the caves, they visited the lair of the giant wolf demon. Here they found 24 gold pieces, a silvered dagger, a small leather case containing a folded spell scroll of Banishment, and a small, mundane <b>gold ring</b>, all of which [[Vichthart]] took.
{{Items}}
[[Category:Items held by Vichthart]]
[[Category:Rings]]
932497443224f2eb40657858e528b3b17e61f73f
596
595
2024-04-29T15:49:30Z
Vicht
1
Added links to Vichthart's dagger and spell scroll of Banishment
wikitext
text/x-wiki
On [[Timeline|29 Thirkuoss]], the party killed [[Srir Silthallow]] by the altar to [[Zaheer]] at the top of the mountain on the [[Zaheer island|island]] where [[Rrekkeh Stormcrawler]] had convinced a pack of [[gnoll]]s to begin summoning [[demon]]s.
Before returning to the slave village, they and [[Szehga]] agreed they should destroy any remaining demons they could find. After patrolling the cave system in the mountain, they were unable to find any demons remaining, and concluded they must have already demanifested from the [[material plane]] due to the defeat of Srir, Rrekkeh and their cultists.
While checking the caves, they visited the lair of the giant wolf demon. Here they found 24 gold pieces, a [[Vichthart's dagger|silvered dagger]], a small leather case containing a folded [[spell scroll of Banishment]], and a small, mundane <b>gold ring</b>, all of which [[Vichthart]] took.
{{Items}}
[[Category:Items held by Vichthart]]
[[Category:Rings]]
d76772c9023e6a69391e7d029ad69bf3ed2ed10e
Vichthart's dagger
0
341
597
2024-04-29T16:38:29Z
Vicht
1
Created page with "On [[Timeline|29 Thirkuoss]], the party killed [[Srir Silthallow]] by the altar to [[Zaheer]] at the top of the mountain on the [[Zaheer island|island]] where [[Rrekkeh Stormcrawler]] had convinced a pack of [[gnoll]]s to begin summoning [[demon]]s. Before returning to the slave village, they and [[Szehga]] agreed they should destroy any remaining demons they could find. After patrolling the cave system in the mountain, they were unable to find any demons remaining, and..."
wikitext
text/x-wiki
On [[Timeline|29 Thirkuoss]], the party killed [[Srir Silthallow]] by the altar to [[Zaheer]] at the top of the mountain on the [[Zaheer island|island]] where [[Rrekkeh Stormcrawler]] had convinced a pack of [[gnoll]]s to begin summoning [[demon]]s.
Before returning to the slave village, they and [[Szehga]] agreed they should destroy any remaining demons they could find. After patrolling the cave system in the mountain, they were unable to find any demons remaining, and concluded they must have already demanifested from the [[material plane]] due to the defeat of Srir, Rrekkeh and their cultists.
While checking the caves, they visited the lair of the giant wolf demon. Here they found 24 gold pieces, a <b>silvered dagger</b>, a small leather case containing a folded [[spell scroll of Banishment]], and a small, mundane [[gold ring]], all of which [[Vichthart]] took.
On 19 Thelliea, the [[Galesong Thervan Indále]] and [[Sable Warden Meriele Berevan]] held a final debrief with the party after their defeat of the [[Knives of Mystra]] and the [[bone devil]]. As part of the thanks for their accomplishment, the church offered to [[silver]] any of the party's weapons. Vichthart asked why they would want that, and it was explained to him that silvered weapons perform better against certain [[fiend]]s, [[undead]] and extraplanar entities.
{{Items}}
[[Category:Items held by Vichthart]]
[[Category:Weapons]]
2b970cb7448cbfca831f10d89033ec72dafe7c2a
Spell scroll of Banishment
0
342
598
2024-04-29T16:38:58Z
Vicht
1
Created page with "On [[Timeline|29 Thirkuoss]], the party killed [[Srir Silthallow]] by the altar to [[Zaheer]] at the top of the mountain on the [[Zaheer island|island]] where [[Rrekkeh Stormcrawler]] had convinced a pack of [[gnoll]]s to begin summoning [[demon]]s. Before returning to the slave village, they and [[Szehga]] agreed they should destroy any remaining demons they could find. After patrolling the cave system in the mountain, they were unable to find any demons remaining, and..."
wikitext
text/x-wiki
On [[Timeline|29 Thirkuoss]], the party killed [[Srir Silthallow]] by the altar to [[Zaheer]] at the top of the mountain on the [[Zaheer island|island]] where [[Rrekkeh Stormcrawler]] had convinced a pack of [[gnoll]]s to begin summoning [[demon]]s.
Before returning to the slave village, they and [[Szehga]] agreed they should destroy any remaining demons they could find. After patrolling the cave system in the mountain, they were unable to find any demons remaining, and concluded they must have already demanifested from the [[material plane]] due to the defeat of Srir, Rrekkeh and their cultists.
While checking the caves, they visited the lair of the giant wolf demon. Here they found 24 gold pieces, a [[Vichthart's dagger|silvered dagger]], a small leather case containing a folded <b>spell scroll of Banishment</b>, and a small, mundane [[gold ring]], all of which [[Vichthart]] took.
{{Items}}
[[Category:Items held by Vichthart]]
[[Category:Spell scrolls]]
9a3db412cb6503f64cd2a639b2a3d306a3475644
Fiend
0
343
600
2024-04-29T22:41:51Z
Vicht
1
Created page with "<b>Fiends</b> are a type of creature, the two main types being [[demon]]s and [[devil]]s. They are amongst the creatures detected by the spell [[Detect Evil and Good]]. Demons and devils are in an eternal, ongoing war in the underworld, called the [[Blood War]]. The [[Erinyes]] found captured by [[Cansa Cinsmic]] in the [[Spire of Conjuration]], [[Vastren]], was a veteran of the Blood War. [[Tiefling]]s are [[humanoid]]s with fiendish heritage. Vastren recognized this..."
wikitext
text/x-wiki
<b>Fiends</b> are a type of creature, the two main types being [[demon]]s and [[devil]]s. They are amongst the creatures detected by the spell [[Detect Evil and Good]].
Demons and devils are in an eternal, ongoing war in the underworld, called the [[Blood War]]. The [[Erinyes]] found captured by [[Cansa Cinsmic]] in the [[Spire of Conjuration]], [[Vastren]], was a veteran of the Blood War.
[[Tiefling]]s are [[humanoid]]s with fiendish heritage. Vastren recognized this when meeting [[Mira]], even though [[Suithrathus Luirmo]] wasn't familiar with a ‘tiefling’. [[Anrel]] uses this to explain to his friends what an [[Aasimar]] is, saying they're like opposites in terms of heritage.
[[Category:Creatures]]
afb151fc53ddb10874cbcddb7a8d439a0f0bc950
Blood War
0
344
601
2024-04-29T22:44:51Z
Vicht
1
Created page with "The <b>Blood War</b> is an eternal, ongoing war in the [[underworld]] between [[demon]]s and [[devil]]s. The [[Erinyes]] found captured by [[Cansa Cinsmic]] in the [[Spire of Conjuration]], [[Vastren]], was a veteran of the Blood War. [[Category:Events]]"
wikitext
text/x-wiki
The <b>Blood War</b> is an eternal, ongoing war in the [[underworld]] between [[demon]]s and [[devil]]s. The [[Erinyes]] found captured by [[Cansa Cinsmic]] in the [[Spire of Conjuration]], [[Vastren]], was a veteran of the Blood War.
[[Category:Events]]
f3a5f3f4078c28d0ca4270a060bb4f23624b7672
Fiend
0
343
602
600
2024-04-29T23:10:33Z
Vicht
1
Added Divine Sense facts
wikitext
text/x-wiki
<b>Fiends</b> are a type of creature, the two main types being [[demon]]s and [[devil]]s. They are amongst the creatures detected by the spell [[Detect Evil and Good]] and the [[Paladin]] class feature [[Divine Sense]].
Demons and devils are in an eternal, ongoing war in the underworld, called the [[Blood War]]. The [[Erinyes]] found captured by [[Cansa Cinsmic]] in the [[Spire of Conjuration]], [[Vastren]], was a veteran of the Blood War.
[[Tiefling]]s are [[humanoid]]s with fiendish heritage. Vastren recognized this when meeting [[Mira]], even though [[Suithrathus Luirmo]] wasn't familiar with a ‘tiefling’. [[Anrel]] uses this to explain to his friends what an [[Aasimar]] is, saying they're like opposites in terms of heritage. For this reason, tieflings show up as a dim glow to those using Divine Sense.
[[Category:Creatures]]
9970c518b144c3a42b833a30b7c0fec96f01547b
Erinyes
0
345
603
2024-04-29T23:40:19Z
Vicht
1
Created page with "An <b>Erinyes</b> is a type of powerful [[devil]] that sits high in their hierarchy. The [[Sable Warden Meriele Berevan]] told [[Mira]] that they are often bodyguards, agents and emissaries for devils that rule the [[Nine Hells]], and some rise the ranks to serve [[Teli Monei]] himself. [[Vastren]] is an Erinyes, and gave information about Erinyes to [[Etorn Hadaran]] when he asked her about them. The Sable Warden had not heard of Vastren in particular. {{Creatures}} [..."
wikitext
text/x-wiki
An <b>Erinyes</b> is a type of powerful [[devil]] that sits high in their hierarchy. The [[Sable Warden Meriele Berevan]] told [[Mira]] that they are often bodyguards, agents and emissaries for devils that rule the [[Nine Hells]], and some rise the ranks to serve [[Teli Monei]] himself.
[[Vastren]] is an Erinyes, and gave information about Erinyes to [[Etorn Hadaran]] when he asked her about them. The Sable Warden had not heard of Vastren in particular.
{{Creatures}}
[[Category:Devils]]
74420d828d1779524f0fadada96175e8e00bcafe
Vichthart's scale mail
0
346
604
2024-04-30T00:04:41Z
Vicht
1
Created page with "<b>Vichthart's scale mail</b> puts him at a disadvantage when attempting anything stealthy. Much like [[Anrel]], because of this, he often stays behind while [[Grokko]] and [[Mira]] scout ahead, or is the one that spoils their stealth. On [[Timeline|12 Thelliea]], the party was exploring a section of aquaduct or sewer accessible by the basement and well of [[Squall's Beacon]]. Inside they encountered a number of [[grey ooze]]s, one of which they originally mistook for a..."
wikitext
text/x-wiki
<b>Vichthart's scale mail</b> puts him at a disadvantage when attempting anything stealthy. Much like [[Anrel]], because of this, he often stays behind while [[Grokko]] and [[Mira]] scout ahead, or is the one that spoils their stealth.
On [[Timeline|12 Thelliea]], the party was exploring a section of aquaduct or sewer accessible by the basement and well of [[Squall's Beacon]]. Inside they encountered a number of [[grey ooze]]s, one of which they originally mistook for an oily puddle. Unprepared for it to animate when Grokko tried to ignite it with a lit torch, they were attacked and several of their metal items were damaged. Vichthart's scale mail, [[Grokko's battleaxe]] and [[Mira's crowbar]] were all hit, partly corroding. Anrel backed up into a corridor to avoid them until they were defeated.
On 19 Thelliea, the [[Galesong Thervan Indále]] and [[Sable Warden Meriele Berevan]] held a final debrief with the party after their defeat of the [[Knives of Mystra]] and the [[bone devil]]. As part of the thanks for their accomplishment, the church offered to repair any damaged equipment they held, which all three affected members of the party readily accepted.
{{Items}}
[[Category:Armour]]
[[Category:Items held by Vichthart]]
6a5314b3f286c8e4da3c2feb52a50a6e766ae06f
Drift globe
0
347
605
2024-04-30T21:27:06Z
Vicht
1
Created page with "On [[Timeline|12 Thelliea]], the party explored [[Kobolwitz Manor]]. Eventually they figured out how to open the entrance to a secret chamber behind a wine rack in [[Ser Reginald Kobolwitz]]'s wine cellar. Inside they found the body of a [[Esker|dead human man]] in a pool of dried blood, thieves' tools scattered on the floor, a wall mount for [[Ser Kobolwitz's scimitar]], and a wooden crate. [[Anrel]] and [[Mira]] dragged the crate out of the secret room and into the wi..."
wikitext
text/x-wiki
On [[Timeline|12 Thelliea]], the party explored [[Kobolwitz Manor]]. Eventually they figured out how to open the entrance to a secret chamber behind a wine rack in [[Ser Reginald Kobolwitz]]'s wine cellar. Inside they found the body of a [[Esker|dead human man]] in a pool of dried blood, thieves' tools scattered on the floor, a wall mount for [[Ser Kobolwitz's scimitar]], and a wooden crate.
[[Anrel]] and [[Mira]] dragged the crate out of the secret room and into the wine cellar. Mira readied his own [[Mira's thieves' tools|thieves' tools]] only to find the crate was already unlocked, then used [[Mage Hand]] to lift the lid. Inside the crate were numerous leather pouches containing vast sums of wealth, a bundle of three [[crossbows]] tied up in string, a glass vial containing a [[Potion of animal friendship|muddy-looking liquid]], and a small sphere of thick glass with blue tint.
[[Vichthart]] was the first to pick up the glass sphere, which he determined was magical by the warmth of its touch. He threw it to Anrel, who threw it to [[Grokko]], who took it upstairs in Kobolwitz Manor to inspect it. Grokko determined it to be a <b>drift globe</b>, which is capable of casting light, floating, and following an individual.
{{Items}}
[[Category:Magic items]]
32c9f1b409cbb1437cb2323713179aacc7369150
606
605
2024-04-30T22:20:48Z
Vicht
1
Added the drift globe's return to the party
wikitext
text/x-wiki
On [[Timeline|12 Thelliea]], the party explored [[Kobolwitz Manor]]. Eventually they figured out how to open the entrance to a secret chamber behind a wine rack in [[Ser Reginald Kobolwitz]]'s wine cellar. Inside they found the body of a [[Esker|dead human man]] in a pool of dried blood, thieves' tools scattered on the floor, a wall mount for [[Ser Kobolwitz's scimitar]], and a wooden crate.
[[Anrel]] and [[Mira]] dragged the crate out of the secret room and into the wine cellar. Mira readied his own [[Mira's thieves' tools|thieves' tools]] only to find the crate was already unlocked, then used [[Mage Hand]] to lift the lid. Inside the crate were numerous leather pouches containing vast sums of wealth, a bundle of three [[crossbows]] tied up in string, a glass vial containing a [[Potion of animal friendship|muddy-looking liquid]], and a small sphere of thick glass with blue tint.
[[Vichthart]] was the first to pick up the glass sphere, which he determined was magical by the warmth of its touch. He threw it to Anrel, who threw it to [[Grokko]], who took it upstairs in Kobolwitz Manor to inspect it. Grokko determined it to be a <b>drift globe</b>, which is capable of casting light, floating, and following an individual.
Mira wishes to take these items, but the others point out that they are exploring a crime scene, and they should leave them for the authorities. They take the crate and leave it (and all of the items from it) on the dining room table.
On 19 Thelliea, the [[Galesong Thervan Indále]] and [[Sable Warden Meriele Berevan]] held a final debrief with the party after their defeat of the [[Knives of Mystra]] and the [[bone devil]]. As part of the thanks for their accomplishment, they presented the party with several items, including those the party had found in Kobolwitz Manor. They were told that while they did well to hand them in, [[Kaarst]] would only arrange for them to be removed from the city, and taking the items would save them the paperwork.
{{Items}}
[[Category:Magical items]]
e5b1c50c1e1a409fdbab06facc4a22b858c633b8
608
606
2024-04-30T22:44:21Z
Vicht
1
Changed tense of penultimate paragraph
wikitext
text/x-wiki
On [[Timeline|12 Thelliea]], the party explored [[Kobolwitz Manor]]. Eventually they figured out how to open the entrance to a secret chamber behind a wine rack in [[Ser Reginald Kobolwitz]]'s wine cellar. Inside they found the body of a [[Esker|dead human man]] in a pool of dried blood, thieves' tools scattered on the floor, a wall mount for [[Ser Kobolwitz's scimitar]], and a wooden crate.
[[Anrel]] and [[Mira]] dragged the crate out of the secret room and into the wine cellar. Mira readied his own [[Mira's thieves' tools|thieves' tools]] only to find the crate was already unlocked, then used [[Mage Hand]] to lift the lid. Inside the crate were numerous leather pouches containing vast sums of wealth, a bundle of three [[crossbows]] tied up in string, a glass vial containing a [[Potion of animal friendship|muddy-looking liquid]], and a small sphere of thick glass with blue tint.
[[Vichthart]] was the first to pick up the glass sphere, which he determined was magical by the warmth of its touch. He threw it to Anrel, who threw it to [[Grokko]], who took it upstairs in Kobolwitz Manor to inspect it. Grokko determined it to be a <b>drift globe</b>, which is capable of casting light, floating, and following an individual.
Mira wanted to take these items, but the others pointed out that they were exploring a crime scene, and they should leave them for the authorities. They took the crate and left it (and all of the items from it) on the dining room table.
On 19 Thelliea, the [[Galesong Thervan Indále]] and [[Sable Warden Meriele Berevan]] held a final debrief with the party after their defeat of the [[Knives of Mystra]] and the [[bone devil]]. As part of the thanks for their accomplishment, they presented the party with several items, including those the party had found in Kobolwitz Manor. They were told that while they did well to hand them in, [[Kaarst]] would only arrange for them to be removed from the city, and taking the items would save them the paperwork.
{{Items}}
[[Category:Magical items]]
382ee07d606f621b8611e032807d4e6e6dbdb22a
634
608
2024-05-06T19:08:33Z
Vicht
1
wikitext
text/x-wiki
== Zaheer island ==
On the [[Zaheer island|island]] used by [[gnoll]]s to summon [[demon]]s, the party found an unoccupied bunkroom in the southeast of the mountain temple, which [[Anrel]] unlocked using the [[Chime of Opening]]. There were four bedrolls to the south and a single bed against the northeast wall. While Anrel stood guard by a set of steps leading up from the northern corner of the room, [[Vichthart]] and [[Grokko]] searched the room.
Underneath the bed to the north they found a small chest containing a [[spell scroll of Lightning Lure]], [[carved bones]], [[Rrekkeh's journal]], and a small, warm sphere of thick glass. Up the stairs to the north they found a separate bunkroom where [[Srir Silthallow]]'s bed was alone. Underneath it the party found a wooden chest, which Anrel smashed open. Inside that was a [[Bag of Holding]], into which the glass sphere was placed.
== Kobolwitz Manor ==
On [[Timeline|12 Thelliea]], the party explored [[Kobolwitz Manor]]. Eventually they figured out how to open the entrance to a secret chamber behind a wine rack in [[Ser Reginald Kobolwitz]]'s wine cellar. Inside they found the body of a [[Esker|dead human man]] in a pool of dried blood, thieves' tools scattered on the floor, a wall mount for [[Ser Kobolwitz's scimitar]], and a wooden crate.
[[Anrel]] and [[Mira]] dragged the crate out of the secret room and into the wine cellar. Mira readied his own [[Mira's thieves' tools|thieves' tools]] only to find the crate was already unlocked, then used [[Mage Hand]] to lift the lid. Inside the crate were numerous leather pouches containing vast sums of wealth, a bundle of three [[crossbows]] tied up in string, a glass vial containing a [[Potion of animal friendship|muddy-looking liquid]], and a small sphere of thick glass with blue tint.
[[Vichthart]] was the first to pick up the glass sphere, which he determined was magical by the warmth of its touch. He threw it to Anrel, who threw it to [[Grokko]], who took it upstairs in Kobolwitz Manor to inspect it. Grokko determined it to be a <b>drift globe</b>, which is capable of casting light, floating, and following an individual.
Mira wanted to take these items, but the others pointed out that they were exploring a crime scene, and they should leave them for the authorities. They took the crate and left it (and all of the items from it) on the dining room table.
== Debrief ==
On 19 Thelliea, the [[Galesong Thervan Indále]] and [[Sable Warden Meriele Berevan]] held a final debrief with the party after their defeat of the [[Knives of Mystra]] and the [[bone devil]]. As part of the thanks for their accomplishment, they presented the party with several items, including those the party had found in Kobolwitz Manor. They were told that while they did well to hand them in, [[Kaarst]] would only arrange for them to be removed from the city, and taking the items would save them the paperwork.
The party spent time deciding how to share these items amongst themselves. They also took the opportunity to examine the glass sphere found beneath [[Rrekkeh Stormcrawler]]'s bed, identifying it as another drift globe. They agreed that both drift globes should go to Vichthart because all three others inherently benefitted from darkvision.
{{Items}}
[[Category:Items held by Vichthart]]
[[Category:Items previously in the Bag of Holding]]
[[Category:Magical items]]
a05e351c23322822cf638e2425deeb781b751e2a
Potion of Animal Friendship
0
348
607
2024-04-30T22:43:31Z
Vicht
1
Created page with "On [[Timeline|12 Thelliea]], the party explored [[Kobolwitz Manor]]. Eventually they figured out how to open the entrance to a secret chamber behind a wine rack in [[Ser Reginald Kobolwitz]]'s wine cellar. Inside they found the body of a [[Esker|dead human man]] in a pool of dried blood, thieves' tools scattered on the floor, a wall mount for [[Ser Kobolwitz's scimitar]], and a wooden crate. [[Anrel]] and [[Mira]] dragged the crate out of the secret room and into the wi..."
wikitext
text/x-wiki
On [[Timeline|12 Thelliea]], the party explored [[Kobolwitz Manor]]. Eventually they figured out how to open the entrance to a secret chamber behind a wine rack in [[Ser Reginald Kobolwitz]]'s wine cellar. Inside they found the body of a [[Esker|dead human man]] in a pool of dried blood, thieves' tools scattered on the floor, a wall mount for [[Ser Kobolwitz's scimitar]], and a wooden crate.
[[Anrel]] and [[Mira]] dragged the crate out of the secret room and into the wine cellar. Mira readied his own [[Mira's thieves' tools|thieves' tools]] only to find the crate was already unlocked, then used [[Mage Hand]] to lift the lid. Inside the crate were numerous leather pouches containing vast sums of wealth, a bundle of three [[crossbows]] tied up in string, a glass vial containing a muddy-looking liquid, and a [[drift globe|small sphere]] of thick glass with blue tint.
[[Grokko]] determined that the vial contained a <b>potion of Animal Friendship</b>. Mira wanted to take these items, but the others pointed out that they were exploring a crime scene, and they should leave them for the authorities. They took the crate and left it (and all of the items from it) on the dining room table.
On 19 Thelliea, the [[Galesong Thervan Indále]] and [[Sable Warden Meriele Berevan]] held a final debrief with the party after their defeat of the [[Knives of Mystra]] and the [[bone devil]]. As part of the thanks for their accomplishment, they presented the party with several items, including those the party had found in Kobolwitz Manor. They were told that while they did well to hand them in, [[Kaarst]] would only arrange for them to be removed from the city, and taking the items would save them the paperwork.
{{Items}}
[[Category:Potions]]
51f23ecdbc62f6ffd907ab1f98ab551e53aa4f3b
Irann Rhogar's house
0
326
609
578
2024-05-01T00:04:04Z
Vicht
1
Added link to Gold candlestick
wikitext
text/x-wiki
<b>Irann Rhogar's house</b> is located in [[Kaarst]]. The party visits it on the morning of [[Timeline|15 Thelliea]] with the [[Sable Warden Meriele Berevan]], who teleports them from there to the [[Acropolis of Kereskaa]].
== Description ==
Rhogar's house is a stately home in the southernmost block of the [[Bell Ward]], not as large as [[Kobolwitz Manor]]. It is a nice house, and well kept, but the interior is tackily decorated, as though by someone who has only recently come into wealth and is keen the spend much too much on a showy home. It contains lots of pictures and golden candlesticks.
The main foyer contains a stairwell, and one room upstairs is a study that Rhogar used as a teleportation chamber. Its furniture was pushed against one wall to clear space, and on the floor was a circle on runic sigils that had evidently been drawn in ink and chalk repeatedly, which [[Grokko]] recognizes as a circle of teleportation, used by mages to travel huge distances. This study contained a stockpile of unusual chalks and bottles of ink.
When the party entered the house, the front door was ajar, the curtains were drawn, and no candles or lanterns were lit. In the main foyer, either side of the stairwell, the bodies of the two surveilling Raven Guards had been pinned to the walls with daggers through their arms and chests. Their jaws had been pulled from their faces, the necks had been pierced and ripped, and blood had pooled beneath them. On the wall above each corpse, their blood had been used to write a message in two parts.
<blockquote>Petty tyrants of lesser gods will not stop us.</blockquote>
<blockquote>Seven stars will burn bright this night.</blockquote>
== History ==
On the night of 14 Thelliea, after exploring <i class="ship">[[Hope's Prize]]</i>, [[Vichthart]] used [[Sending]] to confide in the Sable Warden.
<blockquote><b>Vichthart:</b> There are vampires in Kaarst working with Irann Rhogar. Hope's Prize smuggled contraband explosive to magic. We must meet to discuss and share evidence.</blockquote>
<blockquote><b>Sable Warden:</b> These are worrying claims, I trust not made lightly. I will send my seekers. Bring your evidence to me after sunrise.</blockquote>
The Sable Warden sent a pair of [[Raven Guard]]s to surveil the property. The party rescued [[Father Traulam Eugen]] from [[Valiant Morgen Trading Company Kaarst Branch]], and he convinced [[Vichthart]] that he could trust the Sable Warden.
On the morning of 15 Thelliea, Vichthart took Traulam and [[Grokko]] to the cathedral and shared their evidence with the Sable Warden. She informed them that the Valiant Morgen headquarters had burnt down the night before. When Traulam confirmed their claims that the building had not been on fire when they'd left, she used Sending to message the guards posted at Rhogar's house.
<blockquote><b>Sable Warden:</b> Apprehend target and any accomplices.</blockquote>
After a moment she messaged them again.
<blockquote><b>Sable Warden:</b> Acknowledge this message: You are to act upon the target.</blockquote>
The Sable Warden confirmed that her guards were not responding, then snapped her fingers and strode off, followed by two Raven Guards they hadn't noticed standing in the shadows. Apprehensively, Grokko and Vichthart followed.
Outside, Grokko grabbed [[Mira]] and [[Anrel]] held onto Vichthart to follow with his hood over his face. Together they strode south through the streets of Kaarst as fast as they coulc without appearing to hurry. [[Grimm]] telepathically informed Anrel that the guards posted outside [[Squall's Beacon]] had departed, and on the journey an extra pair of Raven Guards joined the procession.
When they arrived at Irann Rhogar's house, they began searching the house, finding the incomplete teleportation circle and a journal containing a diagram of the circle's completed form and a [[spell scroll of Teleportation]]. The Sable Warden advised the party to make preparations to stop Rhogar while she complete the teleportation circle, giving Mira permission to use Rhogar's wealth to obtain supplies.
While the Sable Warden worked on reconstructing the circle, Mira collected 180 gold pieces from the house and picked up a [[gold candlestick]] for good measure, then he and Anrel visited [[Tiaathque's Medicinal Remedies]] to gather supplies. The Sable Warden answered questions from Grokko by explaining some of Kaarst's and the [[Raven Queen]]'s histories, as well as the nature of gods and the dangers of arcane magic.
When Anrel, Mira and Grimm joined them at Rhogar's house, the Sable Warden used the spell scroll to teleport the party to wherever the circle lead, which turned out to be the [[Acropolis of Kereskaa]].
{{Locations}}
[[Category:Residences]]
56d95ca12189282ef080bfa1dbd9a789cf0efa3f
Ùrlar Valley
0
349
610
2024-05-04T00:47:31Z
Vicht
1
Created page with "<b>Ùrlar Valley</b> is a location in the <b>Fuarcrùn Freeholds</b> where [[Anrel]] lost his entire platoon in approximately [[Timeline|1846]]. They were sent to a village by the church of [[Kaarst]] to investigate reports by agents that a strange excavation site in the area may have been of interest to [[Verein Kirche von Arkhelle]]. None of the platoon sent, including Anrel, ever returned to Kaarst. Members of his platoon included [[Ingen Persson]] and Maghn Ünthe..."
wikitext
text/x-wiki
<b>Ùrlar Valley</b> is a location in the <b>Fuarcrùn Freeholds</b> where [[Anrel]] lost his entire platoon in approximately [[Timeline|1846]].
They were sent to a village by the church of [[Kaarst]] to investigate reports by agents that a strange excavation site in the area may have been of interest to [[Verein Kirche von Arkhelle]]. None of the platoon sent, including Anrel, ever returned to Kaarst. Members of his platoon included [[Ingen Persson]] and [[Maghn Ünthergol]].
With the church assuming that everyone who went had abandoned their posts, [[Kham Gohlrim]] repeatedly sent agents to recover the platoon, but they were either unable to locate Ùrlar Valley or themselves never returned. Eventually, in early 1853, Kham left his post in Kaarst and disappeared. [[Cardinal Maurul Silkendawn]] assumed he'd gone to find Anrel.
== Paladin Anrel Salier ==
According to Anrel, his entire platoon went missing, and he believed them to be dead. However, he suffered the first of a number of blackouts and regained consciousness far away from either Kaarst or the Ùrlar Valley. He had dreams of killing his platoon.
Believing his platoon to be dead and himself to be responsible, he avoided going back to Kaarst. Seven years later, he claimed to Cardinal Silkendawn that he had spent the intervening years investigating the missing people, while to [[Elira Lein]] he claimed that he felt like he was a threat to everyone he knew, including her.
The only thing Anrel has said about the location itself is that he saw an orrery, much larger and grander than the one in the [[Spire of Divination]]. Other than that, he believes there is some kind of consciousness controlling what happens there, saying ‘Something is wrong with that place. There is a presence there. I don't know how to begin describing it.’
=== Cadet Ingen Persson ===
In 1853, Anrel woke up from a blackout in a cell in the [[Ratway]] in the sewers beneath [[Senneborn]], from which he was rescued by the party in early Thirkuoss. As thanks for freeing him, and for helping him to enact revenge on [[Armine Detlef]], who'd placed him there, he accompanied them to [[Droghen's keep]] and the [[Zaheer island|island]] where [[gnoll]]s were summoning [[demon]]s.
In the caves beneath the island, he found the belongings of Ingen Persson—his [[Ingen's satchel|satchel]], [[Ingen's journal|journal]] and [[Ingen's thieves' tools|thieves' tools]], as well as a [[Chime of Opening]]. He also took a tooth that belonged to the wolf demon that had been communicating with him telepathically.
On 18 Thelliea, Anrel woke up in the [[house of healing]] and spoke to Cardinal Silkendawn. He presented Silkendawn with Ingen's belongings and the tooth, which the Cardinal was not greatly impressed by. Nonetheless, he did admit that the nature of the journal was in keeping with Cadet Persson's personality. Anrel gave the tooth to Silkendawn.
{{Locations}}
[[Category:Locations in Fuarcrùn Freeholds]]
0308187691d1ff55a9c78354f5d41a70e9c72202
Seal
0
256
611
471
2024-05-06T12:04:18Z
Vicht
1
Added fate of the remaining 7 Seals, links to Mystra, Spiderweb Shield and Leatherbound books
wikitext
text/x-wiki
The <b>Seals</b> of the Masters of the [[Acropolis of Kereskaa]] are pendants worn by the eight leading scholars in charge of the Acropolis. They are primarily a sign of the wearer's station, but also have limited practical arcane use within the Acropolis.
When the party visits the Acropolis of Kereskaa to stop the [[Knives of Mystra]] from detonating [[ashfire oil]] beneath [[Kade Sirrine Kathedrale]], they manage to recover seven of the eight of the Seals between them.
== Appearance ==
Even after thousands of years they are untarnished. They all resemble golden discs with a central gemstone, although their individual appearances match the designs of their respective altars within the Acropolis. For example, the Seal of Conjuration is made of white gold filaments in elaborate shapes forming arcane sigils, with its gemstone a multicoloured opal; by comparison, the Seal of Illusion resembles a locket on a gold chain, but lacking a clasp to open it.
== Function ==
Each Seal can be worn in proximity to its matching Altar to amplify the effects of that school of magic. In practice, this allows a spell to be cast without requiring any material components or using a spell slot, once per day.
Some routes in the Acropolis can only be taken with the use of Seals.
* A door in the catacombs leading from beaneath the Spire of Transmutation to beneath the Spire of Conjuration can only be opened while wearing the Seal of Conjuration.
* The silvered dragon statues flanking the entrance to the meeting chamber of the Masters will only permit entrance to those wearing a Seal, blasting anyone else who attempts to pass them with ice cold wind.
* The entrance to the vault can only be opened by a majority of the Masters: It takes five people wearing their Seals and stating the respective Masters' names in unison to open the secret door inside the meeting chamber.
* The containment chambers inside the vault require multiple Seals to be in close proximity before they will open. Those on the left and right require three Seals, while the larger central door requires five Seals.
Additionally, the prison holding [[Vastren]] beneath the [[Spire of Conjuration]] can only be deactivated using three Seals along with a small incantation.
== Seals ==
{| class="wikitable"
! scope="col" | School
! scope="col" | Wearer
! scope="col" | Found
! scope="col" | Fate
|-
| [[Conjuration]]
| [[Cansa Cinsmic]]
| Mira took from Cansa's skeleton in her bedroom
| Mira gave to [[Sable Warden Meriele Berevan]]
|-
| [[Divination]]
| [[Suithrathus Luirmo]]
| Mira took from Suithrathus's skeleton in the [[Spire of Divination|Hall of Prophecies]]
| Held by Vichthart
|-
| [[Transmutation]]
| [[Toross Rhistel]]
| Mira took from Toross's skeleton inside his [[Spire of Transmutation|mirror device]]
| Mira gave to [[Sable Warden Meriele Berevan]]
|-
| [[Enchantment]]
| [[Befrir Dalovamri]]
| Grokko took from Befrir's skeletal hand inside the cracked altar in the [[Spire of Enchantment]]
| Held by Grokko
|-
| [[Illusion]]
| [[Farlu Naenreh]]
| Mira retrieved from the armour left by Farlu as a prize for completing his puzzle
| Held by Anrel
|-
| [[Necromancy]]
| [[Teklanna Morantine]]
| Picked up by Vichthart from the chamber that should have contained the [[Dragon Orb of Drimysthonontas]]
| Held by Vichthart
|-
| [[Abjuration]]
| [[Elgrex Anderra]]
| Mira took from the corpse of [[Etorn Hadaran]]
| Mira gave to [[Sable Warden Meriele Berevan]]
|-
| [[Evocation]]
| [[Vithra Rutgeth]]
| Kept by [[Leagallow Tiaathque]], having used it to create [[ashfire oil]] at the Seventh Altar
| Held by Tiaathque
|-
|}
== History ==
=== Finding Seals at random ===
The first Seal that the party finds is the Seal of Conjuration, which Mira takes from the chest of [[Cansa Cinsmic]]'s skeleton, which was lying in her bed in the Spire of Conjuration. He does this without anyone else in the party noticing.
The second Seal they find is the Seal of Divination, which is worn by the skeleton of [[Suithrathus Luirmo]]. Everyone sees Mira take this one, and [[Anrel]] is interrupted chastising Mira by the trapped form of Suithrathus making his presence known, to their surprise. Among the information he provides to the party is the identity and purpose of the Seals, admitting that he has no use of his own in his current form.
The third Seal is that of Transmutation, which Mira takes from the remains of [[Toross Rhistel]] that were trapped inside his mirror device, although only [[Grokko]] was present at the time. After picking this up, Grokko recognizes the glyph on a door outside as resembling that on the Seal of Conjuration. After some trial and error, Mira realises he can open the door if he's wearing the Seal around his neck. Unfortunately, his friends grow bored waiting for him to figure this out and head south. On his own, Mira heads north and finds [[Vastren]] being held in a prison. She explains that it would take three Seals to free her, but Vichthart and Anrel persuade Mira to leave before he can agree to unleash the devil.
When the party encounters the meeting chamber of the Masters, they decide to have the Seals distributed between them in case they become trapped inside and need to door to be opened again. Grokko takes the Seal of Divination from Mira, but Mira resists letting Vichthart take the Seal of Transmutation. Instead, he gives the Seal of Conjuration to the [[Raven Guards]] as they wait outside the council chamber. When the party turns back from the Vault, Mira takes the Seal of Conjuration back from the Raven Guards.
The fourth Seal they find is the Seal of Enchantment, which is held in the skeletal hand of [[Befrir Dalovamri]] in an altar of warm water. Grokko takes the Seal after using his axe to remove the bones, and confirms its identity with Suithrathus.
=== Requiring a fifth Seal ===
When the party meets [[Leagallow Tiaathque]] in the [[Spire of Evocation]], he confirms that [[Etorn Hadaran]] is wearing another of the Seals, and says that he can only be reached via the [[Spire of Abjuration]]. Knowing the kind of magic used to seal that Spire, Suithrathus admits that the only way they could enter would be to use the [[Obsidian Claw]], which they'll need five Seals to retrieve from the Acropolis's vault.
Anrel uses [[Locate Object]] to find any other Seals: At first he can't detect the Seal of Necromancy, but then he locates the Seal of Illusion, which Mira uses [[Levitate]] to head towards. Mira completes the puzzle set by [[Farlu Naenreh]] that reveals to him a mannequin wearing a set of [[purple studded leather armour]] that contains a golden locket devoid of a clasp. When he returns and shows it to Suithrathus, Suithrathus confirms it is the Seal of Illusion.
Now in possession of five Seals, they are able to retrieve the Obsidian Claw. Grokko keeps the Seal of Enchantment for himself and hands the Seal of Divination to Vichthart; Mira keeps the Seal of Transmutation, giving the Seal of Illusion to Anrel, and returning the Seal of Conjuration to the Raven Guards. As they approach the far side of the Acropolis's vault, they find three closed doors, each with a number of gems embedded in them. As they approach these doors, the gems in the doors and the gems in the closest same number of Seals glow sympathetically. The doors to the left and right, each requiring three Seals to open, respectively contain the Obsidian Claw and a [[unknown vault item|pouch in a crystal]] that Suithrathus refuses to describe.
The central, and largest of the doors requires five Seals to open. At Suithrathus's request, they check inside to make sure that the [[Dragon Orb of Drimysthonontas]] also remains in place. However, the pedestal inside is empty, with the Seal of Necromancy lying at its base. Suithrathus quickly concludes that [[Teklanna Morantine]] must have betrayed the rest of the Acropolis to work with the Kytherans.
=== The fate of the Seals ===
When the party uses the Obsidian Claw to enter the Spire of Abjuration, a hologram of [[Elgrex Anderra]] plays, in which she is wearing her Seal of Abjuration while describing how she has heard the attack on the Acropolis from the safety of her Spire, and intends to leave, find any other survivors, and head to [[Geat-Mea]]. After the party defeats the [[bone devil]], Mira retrieves the Seal of Abjuration from the boneless corpse of Etorn Hadaran, suggesting that Elgrex never did leave the ruins of the Acropolis. He also takes the Seal of Conjuration back from the Raven Guards.
While Vichthart and Anrel return to finalise their deal with Tiaathque, who has the Seal of Evocation and has been using it to manufacture the [[ashfire oil]] at the so-called Seventh Altar, Mira and Grokko go to visit Vastren. They use the three Seals they have between them to release Vastren from her prison, although they do not reveal this to Vicht or Anrel.
When Mira later meets with the [[Sable Warden Meriele Berevan]], he hands the Seals of Transmutation, Conjuration and Abjuration to her. She describes them as having very little function outside of the Acropolis, being mostly badges of office, with what little enchantment they have seeming tied to the inner workings of the Acropolis itself. She says that her recommendation will be for the Seals to be held securely to prevent anyone from making their way back into the vault.
On 19 Thelliea, the Sable Warden and [[Galesong Thervan Indále]] hold a final debrief with the party. Vichthart asks Suithrathus Luirmo what he would like done with the artefacts they've taken from the Acropolis of Kereskaa—the Seals, the Obsidian Claw, the [[Spiderweb Shield]] and the [[leatherbound books]] from the [[Acropolis of Kereskaa#Grand Library|Grand Library]]. Suithrathus is happy that the shield and books pose no threat to anyone's safety, but requests that the Obsidian Claw and Seals stay in the hands of those respectful of [[Mystra|Kereskaa]] and the dangers of the Acropolis. The Sable Warden agrees to hold onto the Seals until the Mystral pillar can arrive in Kaarst to investigate the Acropolis safely, and the party hand the remaining Seals to her.
{{Items}}
[[Category:Items previously held by Anrel]]
[[Category:Items previously held by Grokko]]
[[Category:Items previously held by Mira]]
[[Category:Items previously held by Vichthart]]
ad295b7007ba2a045226db527cfcfa192e5a7961
Toy Tausandschwert
0
350
612
2024-05-06T12:17:31Z
Vicht
1
Created page with "In the three days following the party's defeat of the [[Knives of Mystra]] and the [[bone devil]] underneath [[Kaarst]], [[Vichthart]] shops for a present for his 8-year-old child. He buys a squad of hand-painted tin Tausandschwert soldiers for 5 gold. He also buys [[Squall's Beacon sweets|Squall's Beacon-themed sweets]]. {{Items}} [[Category:Items held by Vichthart]]"
wikitext
text/x-wiki
In the three days following the party's defeat of the [[Knives of Mystra]] and the [[bone devil]] underneath [[Kaarst]], [[Vichthart]] shops for a present for his 8-year-old child. He buys a squad of hand-painted tin Tausandschwert soldiers for 5 gold. He also buys [[Squall's Beacon sweets|Squall's Beacon-themed sweets]].
{{Items}}
[[Category:Items held by Vichthart]]
74fd2a42a28ff3b51ec6c426d76c23c196a381d6
613
612
2024-05-06T12:24:54Z
Vicht
1
wikitext
text/x-wiki
In the three days following the party's defeat of the [[Knives of Mystra]] and the [[bone devil]] underneath [[Kaarst]], [[Vichthart]] shops for a batch of locally produced sweets for his family. He buys sticks of rock decorated with patterns taken from [[Squall's Beacon]] for the price of 1 gold piece. He also buys [[Toy Tausandschwert|toy soldiers]] for his 8-year-old child.
{{Items}}
[[Category:Items held by Vichthart]]
ca5962ecb342a457e7a0d2f63f36cad70cbaa13b
626
613
2024-05-06T14:44:37Z
Vicht
1
Undo revision [[Special:Diff/613|613]] by [[Special:Contributions/Vicht|Vicht]] ([[User talk:Vicht|talk]]) Accidental overwrite with content meant for Squall's Beacon sweets
wikitext
text/x-wiki
In the three days following the party's defeat of the [[Knives of Mystra]] and the [[bone devil]] underneath [[Kaarst]], [[Vichthart]] shops for a present for his 8-year-old child. He buys a squad of hand-painted tin Tausandschwert soldiers for 5 gold. He also buys [[Squall's Beacon sweets|Squall's Beacon-themed sweets]].
{{Items}}
[[Category:Items held by Vichthart]]
74fd2a42a28ff3b51ec6c426d76c23c196a381d6
Template:Items
10
329
614
599
2024-05-06T12:46:40Z
Vicht
1
Moved items from Kobolwitz Manor and Valiant Morgen Kaarst Branch to recipients' inventories; renamed magical conduit to ashfire oil; added gems to Grokko's inventory; added souvenirs to Vichthart's inventory
wikitext
text/x-wiki
{{Navbox
| state = plain
| listclass = hlist
| title = Items
| group1 = Party
| list1 =
* [[Waterproof clothing]]
* [[Suithrathus Luirmo]]
* [[Seal]]s
{{Navbox|child
| group2 = [[:Category:Items held by Anrel|Anrel]]
| list2 =
* [[Anrel's plate armour|Plate armour]]
* [[Demon tooth]]
* [[Black hair dye]]
* [[Badge of the Platinum Dragon]]
* [[Potion of invisibility]]
{{Navbox|child
| group3 = [[:Category:Items previously held by Ingen Persson|Ingen's satchel]]
| list3 =
* [[Ingen's journal]]
* [[Ingen's thieves' tools]]
* [[Chime of Opening]]
| group4 = Weapons
| list4 =
* [[Anrel's greatsword|Greatsword]]
* [[Anrel's whip|Whip]]
* [[Anrel's glaive|Glaive]]
* [[Anrel's old sword|Old sword]]
| group5 = Consumed
| list5 =
* [[Ring of Lehman’s Tiny Hut]]
* [[Potion of frost giant strength]]
* [[Ingen's invisibility potion]]
* [[Spell scroll of Lightning Lure]]
}} <!-- End of Anrel -->
| group6 = [[:Category:Items held by Grokko|Grokko]]
| list6 =
* [[Grokko's battleaxe|Battleaxe]]
* [[Detlef's journal]]
* [[Owl feather]]
* [[Firebreathing potion]]
* [[Potion of gaseous form]]
* [[Carved bones]]
* [[Kobolwitz key]]
* [[Ordered potion of healing]]
* [[Certificate of procurement]]
* [[Fey apple]]
* [[Obsidian Claw]]
{{Navbox|child
| group7 = Worn
| list7 =
* [[Fine shirt]]
* [[Ascot]]
* [[Symbol of Bane]]
* [[Platinum ring]]
* [[Ring of Poison Resistance]]
* [[Garnet choker]]
| group8 = Minerals
| list8 =
* [[Pearl of Power]]
* [[Pearl]]
* [[Emerald]]s
* [[Topaz]]
* [[Sapphire]]s
* [[Diamond]]
* [[Obsidian shard]]
* [[Banded agate]]
* [[Eye agate]]
* [[Feywild Shard]]
}} <!-- End of Grokko -->
| group9 = [[:Category:Items held by Mira|Mira]]
| list9 =
* [[Mira's daggers|Daggers]]
* [[Mira's crowbar|Crowbar]]
* [[Mira's robes|Robes]]
* [[Mira's shirt|Shirt]]
* [[Mira's armour|Armour]]
* [[Mira's thieves' tools|Thieves' tools]]
* [[Brewing supplies]]
* [[Apple]]
* [[Gold candlestick]]
* [[Fancy pen]]
* [[Book of the Twinned Flame]]
* [[Pearl]]
* [[Diamond]]s
* [[Erinyes feather]]
* [[Etorn's pocketwatch]]
{{Navbox|child
| group10 = Preserves
| list10 =
* [[Strawberry jam]]
* [[Tainted strawberry jam]]
* [[Snozberry jam]]
* [[Pickled onions]]
* [[Lemon curd]]
| group11 = Arcane
| list11 =
* [[Truth serum]]
* [[Devil blood ink]]
* [[Ashfire oil]]
* [[Weird vial]]
* [[Emerald pen]]
* [[Potion of mind reading]]
* [[Arcane Grimoire]]
* [[Potion of Animal Friendship]]
* [[Charred spell scroll of Expeditious Retreat]]
* [[Charred spell scroll of False Life]]
* [[Charred spell scroll of Featherfall]]
}} <!-- End of Mira -->
| group12 = [[:Category:Items held by Vichthart|Vichthart]]
| list12 =
* [[Vichthart's blanket|Blanket]]
* [[Emerald]]
* [[Ruby beads]]
* [[Gold ring]]
* [[Stone of Far Speech]]
* [[Lemon curd]]
* [[Flat-bottomed ruby]]
* [[Oil of Etherealness]]
* [[Peach-sized ruby]]
* [[Augury bones]]
* [[Crossbow bolt]]s
* [[Drift globe]]s
* [[Crystal ball]]
* [[Toy Tausandschwert]]
* [[Squall's Beacon sweets]]
{{Navbox|child
| group13 = Worn
| list13 =
* [[Vichthart's scale mail|Scale mail]]
* [[Periapt of Wound Closure]]
* [[Platinum ring]]
* [[Vichthart's shield|Shield]]
* [[Spiderweb shield]]
| group14 = Weapons
| list14 =
* [[Vichthart's mace|Mace]]
* [[Vichthart's crossbow|Crossbow]]
* [[Vichthart's dagger|Silvered dagger]]
| group15 = Written
| list15 =
* [[Journal of Rrekkeh Stormcrawler]]
* [[Spell scroll of Banishment]]
* [[Kobolwitz prescription]]
* [[Note of authority]]
* [[Kaarst City Watch incident reports]]
* [[Writ of passage]]
* [[C.B.L. invoice]]
* [[Kobolwitz Manor Tide note]]
* [[Tide invitation]]
}} <!-- End of Vichthart -->
| group16 = [[:Category:Items in the Bag of Holding|Bag of Holding]]
| list16 =
* [[Set of silverware]]
* [[Pair of bone dice]]
* [[Black pearl]]
* [[Harp]]
* [[Magic beads]]
* [[Alchemy jug]]
* [[Eldritch Claw]]
* [[Flasks of blood]]
* [[Spell scroll of Far Step]]
* [[Journal of Irann Rhogar]]
* [[Ashfire oil]]
* [[Leatherbound books]]
}} <!-- End of Party -->
}} <!-- End -->
0c719cfd24e41661e7430eefbd9f76311bcf13be
625
614
2024-05-06T14:40:11Z
Vicht
1
Changed ruby beads and peach-sized ruby to link to Ruby
wikitext
text/x-wiki
{{Navbox
| state = plain
| listclass = hlist
| title = Items
| group1 = Party
| list1 =
* [[Waterproof clothing]]
* [[Suithrathus Luirmo]]
* [[Seal]]s
{{Navbox|child
| group2 = [[:Category:Items held by Anrel|Anrel]]
| list2 =
* [[Anrel's plate armour|Plate armour]]
* [[Demon tooth]]
* [[Black hair dye]]
* [[Badge of the Platinum Dragon]]
* [[Potion of invisibility]]
{{Navbox|child
| group3 = [[:Category:Items previously held by Ingen Persson|Ingen's satchel]]
| list3 =
* [[Ingen's journal]]
* [[Ingen's thieves' tools]]
* [[Chime of Opening]]
| group4 = Weapons
| list4 =
* [[Anrel's greatsword|Greatsword]]
* [[Anrel's whip|Whip]]
* [[Anrel's glaive|Glaive]]
* [[Anrel's old sword|Old sword]]
| group5 = Consumed
| list5 =
* [[Ring of Lehman’s Tiny Hut]]
* [[Potion of frost giant strength]]
* [[Ingen's invisibility potion]]
* [[Spell scroll of Lightning Lure]]
}} <!-- End of Anrel -->
| group6 = [[:Category:Items held by Grokko|Grokko]]
| list6 =
* [[Grokko's battleaxe|Battleaxe]]
* [[Detlef's journal]]
* [[Owl feather]]
* [[Firebreathing potion]]
* [[Potion of gaseous form]]
* [[Carved bones]]
* [[Kobolwitz key]]
* [[Ordered potion of healing]]
* [[Certificate of procurement]]
* [[Fey apple]]
* [[Obsidian Claw]]
{{Navbox|child
| group7 = Worn
| list7 =
* [[Fine shirt]]
* [[Ascot]]
* [[Symbol of Bane]]
* [[Platinum ring]]
* [[Ring of Poison Resistance]]
* [[Garnet choker]]
| group8 = Minerals
| list8 =
* [[Pearl of Power]]
* [[Pearl]]
* [[Emerald]]s
* [[Topaz]]
* [[Sapphire]]s
* [[Diamond]]
* [[Obsidian shard]]
* [[Banded agate]]
* [[Eye agate]]
* [[Feywild Shard]]
}} <!-- End of Grokko -->
| group9 = [[:Category:Items held by Mira|Mira]]
| list9 =
* [[Mira's daggers|Daggers]]
* [[Mira's crowbar|Crowbar]]
* [[Mira's robes|Robes]]
* [[Mira's shirt|Shirt]]
* [[Mira's armour|Armour]]
* [[Mira's thieves' tools|Thieves' tools]]
* [[Brewing supplies]]
* [[Apple]]
* [[Gold candlestick]]
* [[Fancy pen]]
* [[Book of the Twinned Flame]]
* [[Pearl]]
* [[Diamond]]s
* [[Erinyes feather]]
* [[Etorn's pocketwatch]]
{{Navbox|child
| group10 = Preserves
| list10 =
* [[Strawberry jam]]
* [[Tainted strawberry jam]]
* [[Snozberry jam]]
* [[Pickled onions]]
* [[Lemon curd]]
| group11 = Arcane
| list11 =
* [[Truth serum]]
* [[Devil blood ink]]
* [[Ashfire oil]]
* [[Weird vial]]
* [[Emerald pen]]
* [[Potion of mind reading]]
* [[Arcane Grimoire]]
* [[Potion of Animal Friendship]]
* [[Charred spell scroll of Expeditious Retreat]]
* [[Charred spell scroll of False Life]]
* [[Charred spell scroll of Featherfall]]
}} <!-- End of Mira -->
| group12 = [[:Category:Items held by Vichthart|Vichthart]]
| list12 =
* [[Vichthart's blanket|Blanket]]
* [[Emerald]]
* [[Ruby|Ruby beads]]
* [[Gold ring]]
* [[Stone of Far Speech]]
* [[Lemon curd]]
* [[Flat-bottomed ruby]]
* [[Oil of Etherealness]]
* [[Ruby|Peach-sized ruby]]
* [[Augury bones]]
* [[Crossbow bolt]]s
* [[Drift globe]]s
* [[Crystal ball]]
* [[Toy Tausandschwert]]
* [[Squall's Beacon sweets]]
{{Navbox|child
| group13 = Worn
| list13 =
* [[Vichthart's scale mail|Scale mail]]
* [[Periapt of Wound Closure]]
* [[Platinum ring]]
* [[Vichthart's shield|Shield]]
* [[Spiderweb shield]]
| group14 = Weapons
| list14 =
* [[Vichthart's mace|Mace]]
* [[Vichthart's crossbow|Crossbow]]
* [[Vichthart's dagger|Silvered dagger]]
| group15 = Written
| list15 =
* [[Journal of Rrekkeh Stormcrawler]]
* [[Spell scroll of Banishment]]
* [[Kobolwitz prescription]]
* [[Note of authority]]
* [[Kaarst City Watch incident reports]]
* [[Writ of passage]]
* [[C.B.L. invoice]]
* [[Kobolwitz Manor Tide note]]
* [[Tide invitation]]
}} <!-- End of Vichthart -->
| group16 = [[:Category:Items in the Bag of Holding|Bag of Holding]]
| list16 =
* [[Set of silverware]]
* [[Pair of bone dice]]
* [[Black pearl]]
* [[Harp]]
* [[Magic beads]]
* [[Alchemy jug]]
* [[Eldritch Claw]]
* [[Flasks of blood]]
* [[Spell scroll of Far Step]]
* [[Journal of Irann Rhogar]]
* [[Ashfire oil]]
* [[Leatherbound books]]
}} <!-- End of Party -->
}} <!-- End -->
51934810051cda026c0627546ae9166995307e80
641
625
2024-05-06T22:24:22Z
Vicht
1
Simplified rubies in Vichthart and agates in Grokko; added Bottled Breath to Anrel, ivory dice to Grokko, spell scroll of Immolation to Mira; moved spell scroll of Banishment from Vichthart to Mira, spell scroll of Far Step from Bag of Holding to Mira, carved bones from Grokko to Bag of Holding, Ring of Poison Resistance from Grokko to Vichthart; replaced weird potion with potion of Mind Reading, added spell scoll subcategory to Mira
wikitext
text/x-wiki
{{Navbox
| state = plain
| listclass = hlist
| title = Items
| group1 = Party
| list1 =
* [[Waterproof clothing]]
* [[Suithrathus Luirmo]]
* [[Seal]]s
{{Navbox|child
| group2 = [[:Category:Items held by Anrel|Anrel]]
| list2 =
* [[Anrel's plate armour|Plate armour]]
* [[Demon tooth]]
* [[Black hair dye]]
* [[Badge of the Platinum Dragon]]
* [[Potion of invisibility]]
{{Navbox|child
| group3 = [[:Category:Items previously held by Ingen Persson|Ingen's satchel]]
| list3 =
* [[Ingen's journal]]
* [[Ingen's thieves' tools]]
* [[Chime of Opening]]
| group4 = Weapons
| list4 =
* [[Anrel's greatsword|Greatsword]]
* [[Anrel's whip|Whip]]
* [[Anrel's glaive|Glaive]]
* [[Anrel's old sword|Old sword]]
| group5 = Consumed
| list5 =
* [[Ring of Lehman’s Tiny Hut]]
* [[Potion of frost giant strength]]
* [[Ingen's invisibility potion]]
* [[Spell scroll of Lightning Lure]]
}} <!-- End of Anrel -->
| group6 = [[:Category:Items held by Grokko|Grokko]]
| list6 =
* [[Grokko's battleaxe|Battleaxe]]
* [[Detlef's journal]]
* [[Owl feather]]
* [[Firebreathing potion]]
* [[Ivory dice]]
* [[Potion of gaseous form]]
* [[Kobolwitz key]]
* [[Ordered potion of healing]]
* [[Certificate of procurement]]
* [[Fey apple]]
* [[Obsidian Claw]]
{{Navbox|child
| group7 = Worn
| list7 =
* [[Fine shirt]]
* [[Ascot]]
* [[Symbol of Bane]]
* [[Platinum ring]]
* [[Garnet choker]]
| group8 = Minerals
| list8 =
* [[Pearl of Power]]
* [[Pearl]]
* [[Emerald]]s
* [[Topaz]]
* [[Sapphire]]s
* [[Diamond]]
* [[Agate]]s
* [[Obsidian shard]]
* [[Feywild Shard]]
}} <!-- End of Grokko -->
| group9 = [[:Category:Items held by Mira|Mira]]
| list9 =
* [[Mira's daggers|Daggers]]
* [[Mira's crowbar|Crowbar]]
* [[Mira's robes|Robes]]
* [[Mira's shirt|Shirt]]
* [[Mira's armour|Armour]]
* [[Mira's thieves' tools|Thieves' tools]]
* [[Brewing supplies]]
* [[Apple]]
* [[Gold candlestick]]
* [[Fancy pen]]
* [[Book of the Twinned Flame]]
* [[Pearl]]
* [[Diamond]]s
* [[Erinyes feather]]
* [[Etorn's pocketwatch]]
{{Navbox|child
| group10 = Preserves
| list10 =
* [[Strawberry jam]]
* [[Tainted strawberry jam]]
* [[Snozberry jam]]
* [[Pickled onions]]
* [[Lemon curd]]
| group11 = Arcane
| list11 =
* [[Truth serum]]
* [[Devil blood ink]]
* [[Ashfire oil]]
* [[Potion of Mind Reading]]
* [[Emerald pen]]
* [[Arcane Grimoire]]
* [[Potion of Animal Friendship]]
{{Navbox|child
| group12 = [[:Category:Spell scrolls|Spell scrolls]]
| list12 =
* [[Charred spell scroll of Expeditious Retreat]]
* [[Charred spell scroll of False Life]]
* [[Charred spell scroll of Featherfall]]
* [[Spell scroll of Banishment]]
* [[Spell scroll of Far Step]]
* [[Spell scroll of Immolation]]
}} <!-- End of spell scrolls -->
}} <!-- End of Mira -->
| group13 = [[:Category:Items held by Vichthart|Vichthart]]
| list13 =
* [[Vichthart's blanket|Blanket]]
* [[Emerald]]
* [[Ruby|Rubies]]
* [[Gold ring]]
* [[Stone of Far Speech]]
* [[Lemon curd]]
* [[Flat-bottomed ruby]]
* [[Oil of Etherealness]]
* [[Augury bones]]
* [[Crossbow bolt]]s
* [[Drift globe]]s
* [[Crystal ball]]
* [[Toy Tausandschwert]]
* [[Squall's Beacon sweets]]
{{Navbox|child
| group14 = Worn
| list14 =
* [[Vichthart's scale mail|Scale mail]]
* [[Periapt of Wound Closure]]
* [[Platinum ring]]
* [[Vichthart's shield|Shield]]
* [[Spiderweb shield]]
* [[Ring of Poison Resistance]]
| group15 = Weapons
| list15 =
* [[Vichthart's mace|Mace]]
* [[Vichthart's crossbow|Crossbow]]
* [[Vichthart's dagger|Silvered dagger]]
| group16 = Written
| list16 =
* [[Journal of Rrekkeh Stormcrawler]]
* [[Kobolwitz prescription]]
* [[Note of authority]]
* [[Kaarst City Watch incident reports]]
* [[Writ of passage]]
* [[C.B.L. invoice]]
* [[Kobolwitz Manor Tide note]]
* [[Tide invitation]]
}} <!-- End of Vichthart -->
| group17 = [[:Category:Items in the Bag of Holding|Bag of Holding]]
| list17 =
* [[Set of silverware]]
* [[Pair of bone dice]]
* [[Black pearl]]
* [[Harp]]
* [[Carved bones]]
* [[Magic beads]]
* [[Alchemy jug]]
* [[Eldritch Claw]]
* [[Flasks of blood]]
* [[Journal of Irann Rhogar]]
* [[Ashfire oil]]
* [[Leatherbound books]]
}} <!-- End of Party -->
}} <!-- End -->
ea7b3db46d3ecc20ccc85239907d5b5a1e8edba3
Diamond
0
177
615
299
2024-05-06T13:46:47Z
Vicht
1
Added links to some of Grokko's other minerals, and to Knives of Mystra and Kaarst, changed tenses of events to past tense, added to Category:Items held by Grokko
wikitext
text/x-wiki
A <b>diamond</b> is a rare and valuable gemstone. [[Grokko]] found a diamond worth 50 gold pieces along with a [[topaz]], [[sapphire]]s, [[pearl]]s and [[Ruby|rubies]] in the sewers beneath [[Senneborn]].
[[Ser Reginald Kobolwitz]] wrote that he had wrestled a [[dragon]] and taken its diamond, although [[Vichthart]] found his writing pompous not to mention unverifiable. Vichthart later perused the [[Ravensfair]] market stalls for 200 gold pieces' worth of diamond dust so he could cast the spell [[Glyph of Warding]], but this was of course far too rare and valuable for market stalls to stock.
When [[Mira]] recovered the valuables he lost to the mirror device in the [[Spire of Transmutation]]—106 gold pieces, 12 silver pieces, 6 copper pieces, 1 [[pearl]] worth 100 gold pieces, and 1 [[candlestick]] worth about 25 gold pieces—in the vault of the [[Acropolis of Kereskaa]], he also found and took 3 diamonds. In the 3 days after the party defeated the [[Knives of Mystra]] and the [[bone devil]] beneath [[Karst]], Mira got these appraised as having a combined value of 500 gold pieces.
The emblem of the [[Valiant Morgen Trading Company]] is a diamond in front of a red rising sun. It is portrayed in the stained glass window about the main entrance to the [[Valiant Morgen Trading Company Kaarst Branch]].
{{Items}}
[[Category:Items held by Grokko]]
[[Category:Items held by Mira]]
[[Category:Mineral items]]
bbf7c376a8362e7811a2fe239a471618b9048a46
617
615
2024-05-06T13:50:13Z
Vicht
1
Added link to Detlef and emerald
wikitext
text/x-wiki
A <b>diamond</b> is a rare and valuable gemstone. [[Grokko]] found a diamond worth 50 gold pieces along with a [[topaz]], [[sapphire]]s, [[emerald]]s, [[pearl]]s and [[Ruby|rubies]] in [[Detlef]]'s lair beneath [[Senneborn]].
[[Ser Reginald Kobolwitz]] wrote that he had wrestled a [[dragon]] and taken its diamond, although [[Vichthart]] found his writing pompous not to mention unverifiable. Vichthart later perused the [[Ravensfair]] market stalls for 200 gold pieces' worth of diamond dust so he could cast the spell [[Glyph of Warding]], but this was of course far too rare and valuable for market stalls to stock.
When [[Mira]] recovered the valuables he lost to the mirror device in the [[Spire of Transmutation]]—106 gold pieces, 12 silver pieces, 6 copper pieces, 1 [[pearl]] worth 100 gold pieces, and 1 [[candlestick]] worth about 25 gold pieces—in the vault of the [[Acropolis of Kereskaa]], he also found and took 3 diamonds. In the 3 days after the party defeated the [[Knives of Mystra]] and the [[bone devil]] beneath [[Karst]], Mira got these appraised as having a combined value of 500 gold pieces.
The emblem of the [[Valiant Morgen Trading Company]] is a diamond in front of a red rising sun. It is portrayed in the stained glass window about the main entrance to the [[Valiant Morgen Trading Company Kaarst Branch]].
{{Items}}
[[Category:Items held by Grokko]]
[[Category:Items held by Mira]]
[[Category:Mineral items]]
df999cb166b49009c3aa2f62cac834acb0927360
618
617
2024-05-06T13:51:35Z
Vicht
1
Added links to owl feather and Detlef's journal
wikitext
text/x-wiki
A <b>diamond</b> is a rare and valuable gemstone. [[Grokko]] found a diamond worth 50 gold pieces along with a [[topaz]], [[sapphire]]s, [[emerald]]s, [[pearl]]s, [[Ruby|rubies]], an [[owl feather]] and [[Detlef's journal]] in [[Detlef]]'s lair beneath [[Senneborn]].
[[Ser Reginald Kobolwitz]] wrote that he had wrestled a [[dragon]] and taken its diamond, although [[Vichthart]] found his writing pompous not to mention unverifiable. Vichthart later perused the [[Ravensfair]] market stalls for 200 gold pieces' worth of diamond dust so he could cast the spell [[Glyph of Warding]], but this was of course far too rare and valuable for market stalls to stock.
When [[Mira]] recovered the valuables he lost to the mirror device in the [[Spire of Transmutation]]—106 gold pieces, 12 silver pieces, 6 copper pieces, 1 [[pearl]] worth 100 gold pieces, and 1 [[candlestick]] worth about 25 gold pieces—in the vault of the [[Acropolis of Kereskaa]], he also found and took 3 diamonds. In the 3 days after the party defeated the [[Knives of Mystra]] and the [[bone devil]] beneath [[Karst]], Mira got these appraised as having a combined value of 500 gold pieces.
The emblem of the [[Valiant Morgen Trading Company]] is a diamond in front of a red rising sun. It is portrayed in the stained glass window about the main entrance to the [[Valiant Morgen Trading Company Kaarst Branch]].
{{Items}}
[[Category:Items held by Grokko]]
[[Category:Items held by Mira]]
[[Category:Mineral items]]
249c768e87e8980309b7cb46278d75c136425bda
Topaz
0
351
616
2024-05-06T13:48:54Z
Vicht
1
Created page with "[[Grokko]] found a <b>topaz</b> worth 10 gold pieces along with a [[diamond]], [[sapphire]]s, [[emerald]]s, [[pearl]]s and [[Ruby|rubies]] in [[Detlef]]'s lair beneath [[Senneborn]]. {{Items}} [[Category:Items held by Grokko]] [[Category:Mineral items]]"
wikitext
text/x-wiki
[[Grokko]] found a <b>topaz</b> worth 10 gold pieces along with a [[diamond]], [[sapphire]]s, [[emerald]]s, [[pearl]]s and [[Ruby|rubies]] in [[Detlef]]'s lair beneath [[Senneborn]].
{{Items}}
[[Category:Items held by Grokko]]
[[Category:Mineral items]]
825deb65f922f2b92fc67cb5969845e8815d3304
619
616
2024-05-06T13:52:05Z
Vicht
1
Added links to owl feather and Detlef's journal
wikitext
text/x-wiki
[[Grokko]] found a <b>topaz</b> worth 10 gold pieces along with a [[diamond]], [[sapphire]]s, [[emerald]]s, [[pearl]]s, [[Ruby|rubies]], an [[owl feather]] and [[Detlef's journal]] in [[Detlef]]'s lair beneath [[Senneborn]].
{{Items}}
[[Category:Items held by Grokko]]
[[Category:Mineral items]]
9060684d3e298dfbd15d582e88f1d1d79d1472b3
620
619
2024-05-06T13:55:57Z
Vicht
1
Added Kobolwitz's scimitar
wikitext
text/x-wiki
[[Grokko]] found a <b>topaz</b> worth 10 gold pieces along with a [[diamond]], [[sapphire]]s, [[emerald]]s, [[pearl]]s, [[Ruby|rubies]], an [[owl feather]] and [[Detlef's journal]] in [[Detlef]]'s lair beneath [[Senneborn]].
[[Ser Kobolwitz's scimitar]] has its blue-tinted hilt carved into the shape of an owl with glittering yellow topaz for eyes.
{{Items}}
[[Category:Items held by Grokko]]
[[Category:Mineral items]]
03179730aa5e66d8171ffe1fb4c4ac8e7dc197b6
Emerald
0
352
621
2024-05-06T14:15:02Z
Vicht
1
Created page with "[[Grokko]] found a pouch of three <b>emeralds</b> along with a [[diamond]], a [[topaz]], [[sapphire]]s, [[pearl]]s, [[Ruby|rubies]], an [[owl feather]] and [[Detlef's journal]] in [[Detlef]]'s lair beneath [[Senneborn]]. [[Vichthart]] took one of these emeralds (worth 10 gold pieces) for the church, while Grokko kept the other two (worth 5 and 10 gold pieces respectively). [[Kenneth]] found an uncut emerald worth about 10 gold pieces in the jailer's office of the Ratw..."
wikitext
text/x-wiki
[[Grokko]] found a pouch of three <b>emeralds</b> along with a [[diamond]], a [[topaz]], [[sapphire]]s, [[pearl]]s, [[Ruby|rubies]], an [[owl feather]] and [[Detlef's journal]] in [[Detlef]]'s lair beneath [[Senneborn]]. [[Vichthart]] took one of these emeralds (worth 10 gold pieces) for the church, while Grokko kept the other two (worth 5 and 10 gold pieces respectively).
[[Kenneth]] found an uncut emerald worth about 10 gold pieces in the jailer's office of the [[Ratway]].
[[Mira]] found an [[Emerald Pen]] in the [[Acropolis of Kereskaa]], a magical pen with a nib made of emerald.
Emerald green is a colour associated with [[Zaheer]]; [[Amnon Ingolidan]] wore simple robes with an emerald green trim when the party met him at night on [[Timeline|12 Thelliea]].
{{Items}}
[[Category:Items held by Grokko]]
[[Category:Items held by Kenneth]]
[[Category:Items held by Vichthart]]
[[Category:Mineral items]]
265e866de9367a9023cbcca71b148ee063095615
Sapphire
0
353
622
2024-05-06T14:18:08Z
Vicht
1
Created page with "[[Grokko]] found two <b>sapphires</b> along with a [[diamond]], a [[topaz]], [[emerald]]s, [[pearl]]s, [[Ruby|rubies]], an [[owl feather]] and [[Detlef's journal]] in [[Detlef]]'s lair beneath [[Senneborn]]. One sapphire was cut, the other was uncut, but both were worth 10 gold pieces each. [[Father Traulam Eugen]] wore his holy symbol of [[Bahamut]], a [[platinum]] ring set with sapphires. Although [[Vichthart]] remembered this item, he was unable to locate it when he..."
wikitext
text/x-wiki
[[Grokko]] found two <b>sapphires</b> along with a [[diamond]], a [[topaz]], [[emerald]]s, [[pearl]]s, [[Ruby|rubies]], an [[owl feather]] and [[Detlef's journal]] in [[Detlef]]'s lair beneath [[Senneborn]]. One sapphire was cut, the other was uncut, but both were worth 10 gold pieces each.
[[Father Traulam Eugen]] wore his holy symbol of [[Bahamut]], a [[platinum]] ring set with sapphires. Although [[Vichthart]] remembered this item, he was unable to locate it when he used [[Locate Object]] on [[Timeline|13 Thelliea]].
{{Items}}
[[Category:Items held by Grokko]]
[[Category:Mineral items]]
193ab6390d11d91ade5c497057a3875d450f7b94
Owl feather
0
354
623
2024-05-06T14:30:29Z
Vicht
1
Created page with "[[Grokko]] found an <b>owl feather</b> along with a [[diamond]], a [[topaz]], [[sapphire]]s, [[emerald]]s, [[pearl]]s, [[Ruby|rubies]], and [[Detlef's journal]] in [[Detlef]]'s lair beneath [[Senneborn]]. {{Items}} [[Category:Items held by Grokko]]"
wikitext
text/x-wiki
[[Grokko]] found an <b>owl feather</b> along with a [[diamond]], a [[topaz]], [[sapphire]]s, [[emerald]]s, [[pearl]]s, [[Ruby|rubies]], and [[Detlef's journal]] in [[Detlef]]'s lair beneath [[Senneborn]].
{{Items}}
[[Category:Items held by Grokko]]
957119fc939535320d688eabe980d1541b68a683
Ruby
0
178
624
300
2024-05-06T14:39:09Z
Vicht
1
More information on origin of ruby beads, reordered bullets to prioritize party items over items worn by other characters, corrected spelling of divining mirror and Nothic
wikitext
text/x-wiki
A <b>ruby</b> is a valuable gemstone.
* [[Grokko]] found a <b>bag of ruby beads</b> worth 50 gold pieces along with a [[diamond]], a [[topaz]], [[sapphire]]s, [[emerald]]s, [[pearl]]s, an [[owl feather]] and [[Detlef's journal]] in [[Detlef]]'s lair beneath [[Senneborn]]. He gave it to [[Vichthart]].
* A [[flat-bottomed ruby]] was used by [[Irann Rhoger]] to read [[devil blood ink]], which Vichthart took.
* A rough, <b>peach-sized ruby</b> was inside a bundle of cloth in the [[Nothic]]s' bedroom, which Vichthart took.
* [[Sable Warden Meriele Berevan]] wears a simple dark steel circlet with a blood-red ruby inset.
* [[Etaf]] wears a ruby choker.
* [[Suithrathus Luirmo]] transfers himself from his black quartz divining mirror to an uncut ruby.
* The [[fey apple]] that the [[feywild tree]] gives to [[Grokko]] is ruby-red.
{{Items}}
[[Category:Items held by Vichthart]]
[[Category:Mineral items]]
fd51cae88bbccaef24c46f33f66b3425ab342ac7
Squall's Beacon sweets
0
355
627
2024-05-06T14:44:53Z
Vicht
1
Created page with "In the three days following the party's defeat of the [[Knives of Mystra]] and the [[bone devil]] underneath [[Kaarst]], [[Vichthart]] shops for a batch of locally produced sweets for his family. He buys sticks of rock decorated with patterns taken from [[Squall's Beacon]] for the price of 1 gold piece. He also buys [[Toy Tausandschwert|toy soldiers]] for his 8-year-old child. {{Items}} [[Category:Items held by Vichthart]]"
wikitext
text/x-wiki
In the three days following the party's defeat of the [[Knives of Mystra]] and the [[bone devil]] underneath [[Kaarst]], [[Vichthart]] shops for a batch of locally produced sweets for his family. He buys sticks of rock decorated with patterns taken from [[Squall's Beacon]] for the price of 1 gold piece. He also buys [[Toy Tausandschwert|toy soldiers]] for his 8-year-old child.
{{Items}}
[[Category:Items held by Vichthart]]
ca5962ecb342a457e7a0d2f63f36cad70cbaa13b
Items
0
330
628
583
2024-05-06T14:53:51Z
Vicht
1
Changed from transclusion to redirect
wikitext
text/x-wiki
#REDIRECT [[Template:Items]]
17b3a96582cfd2e6ff7eb10c6501f5b020b6fc95
Characters
0
194
629
323
2024-05-06T14:55:09Z
Vicht
1
Changed from transclusion to redirect
wikitext
text/x-wiki
#REDIRECT [[Template:Characters]]
1fdb9c762b81eff8d11672a1c14b75bd4713c445
Locations
0
195
630
326
2024-05-06T14:55:38Z
Vicht
1
Changed from transclusion to redirect
wikitext
text/x-wiki
#REDIRECT [[Template:Locations]]
0cdcd8a7b67e8dff1ab9ad92214a3b82874d72c0
MediaWiki:Sidebar
8
149
631
483
2024-05-06T14:56:18Z
Vicht
1
wikitext
text/x-wiki
* navigation
** mainpage|mainpage-description
** recentchanges-url|recentchanges
** randompage-url|randompage
//** helppage|help-mediawiki
* Pages
** Sessions|Sessions
** Timeline|Timeline
** Calendar|Calendar
** Template:Characters|Characters
** Template:Locations|Locations
** Template:Items|Items
** Special:Categories|Categories
* SEARCH
* TOOLBOX
* LANGUAGES
414627bae163f706fffef6a9090a6c05697b97ad
Spell scroll of Banishment
0
342
632
598
2024-05-06T15:22:28Z
Vicht
1
Added change of ownership from Vichthart to Mira
wikitext
text/x-wiki
On [[Timeline|29 Thirkuoss]], the party killed [[Srir Silthallow]] by the altar to [[Zaheer]] at the top of the mountain on the [[Zaheer island|island]] where [[Rrekkeh Stormcrawler]] had convinced a pack of [[gnoll]]s to begin summoning [[demon]]s.
Before returning to the slave village, they and [[Szehga]] agreed they should destroy any remaining demons they could find. After patrolling the cave system in the mountain, they were unable to find any demons remaining, and concluded they must have already demanifested from the [[material plane]] due to the defeat of Srir, Rrekkeh and their cultists.
While checking the caves, they visited the lair of the giant wolf demon. Here they found 24 gold pieces, a [[Vichthart's dagger|silvered dagger]], a small leather case containing a folded <b>spell scroll of Banishment</b>, and a small, mundane [[gold ring]], all of which [[Vichthart]] took.
On 19 Thelliea, the party decided how to share the items presented to them by [[Sable Warden Meriele Berevan]] and [[Galesong Thervan Indále]]. They agreed that the charred spell scrolls of [[Spell scroll of Expeditious Retreat|Expeditious Retreat]], [[Charred spell scroll of False Life|False Life]], and [[Charred spell scroll of Featherfall|Featherfall]] should go to [[Mira]]. At the same time, Vichthart gave Mira his spell scroll of Banishment.
{{Items}}
[[Category:Items previously held by Vichthart]]
[[Category:Items held by Mira]]
[[Category:Spell scrolls]]
77446795a0b4faea13ddc4682a53c78fd115d1c0
633
632
2024-05-06T15:28:14Z
Vicht
1
Added fuller description of the charred spell scrolls presented to the party
wikitext
text/x-wiki
On [[Timeline|29 Thirkuoss]], the party killed [[Srir Silthallow]] by the altar to [[Zaheer]] at the top of the mountain on the [[Zaheer island|island]] where [[Rrekkeh Stormcrawler]] had convinced a pack of [[gnoll]]s to begin summoning [[demon]]s.
Before returning to the slave village, they and [[Szehga]] agreed they should destroy any remaining demons they could find. After patrolling the cave system in the mountain, they were unable to find any demons remaining, and concluded they must have already demanifested from the [[material plane]] due to the defeat of Srir, Rrekkeh and their cultists.
While checking the caves, they visited the lair of the giant wolf demon. Here they found 24 gold pieces, a [[Vichthart's dagger|silvered dagger]], a small leather case containing a folded <b>spell scroll of Banishment</b>, and a small, mundane [[gold ring]], all of which [[Vichthart]] took.
On 19 Thelliea, the [[Galesong Thervan Indále]] and [[Sable Warden Meriele Berevan]] held a final debrief with the party after their defeat of the [[Knives of Mystra]] and the [[bone devil]]. As part of the thanks for their accomplishment, they presented the party with several items, including those that were recovered from the locked safe in the [[Valiant Morgen Trading Company Kaarst Branch]]. They were told that [[Kaarst]] would only arrange for them to be removed from the city, and taking the items would save them the paperwork.
The party spent time deciding how to share these items amongst themselves. They agreed that the charred spell scrolls of [[Spell scroll of Expeditious Retreat|Expeditious Retreat]], [[Charred spell scroll of False Life|False Life]], and [[Charred spell scroll of Featherfall|Featherfall]] should go to [[Mira]]. At the same time, Vichthart gave Mira his spell scroll of Banishment.
{{Items}}
[[Category:Items previously held by Vichthart]]
[[Category:Items held by Mira]]
[[Category:Spell scrolls]]
f725d5bdb74a95bb5e73e41a1fe0417d93820934
Carved bones
0
356
635
2024-05-06T19:12:33Z
Vicht
1
Created page with "On the [[Zaheer island|island]] used by [[gnoll]]s to summon [[demon]]s, the party found an unoccupied bunkroom in the southeast of the mountain temple, which [[Anrel]] unlocked using the [[Chime of Opening]]. There were four bedrolls to the south and a single bed against the northeast wall. While Anrel stood guard by a set of steps leading up from the northern corner of the room, [[Vichthart]] and [[Grokko]] searched the room. Underneath the bed to the north they found..."
wikitext
text/x-wiki
On the [[Zaheer island|island]] used by [[gnoll]]s to summon [[demon]]s, the party found an unoccupied bunkroom in the southeast of the mountain temple, which [[Anrel]] unlocked using the [[Chime of Opening]]. There were four bedrolls to the south and a single bed against the northeast wall. While Anrel stood guard by a set of steps leading up from the northern corner of the room, [[Vichthart]] and [[Grokko]] searched the room.
Underneath the bed to the north they found a small chest containing a [[spell scroll of Lightning Lure]], [[Rrekkeh's journal]], a [[drift globe]], and a leather pouch containing <b>carved and polished animal bones</b>. Up the stairs to the north they found a separate bunkroom where [[Srir Silthallow]]'s bed was alone. Underneath it the party found a wooden chest, which Anrel smashed open. Inside that was a [[Bag of Holding]], into which the carved bones were placed.
{{Items}}
[[Category:Items in the Bag of Holding]]
95a83464aabc0473418ff2268fb82539400815cc
Ingen's invisibility potion
0
327
636
580
2024-05-06T21:06:47Z
Vicht
1
Added Category:Consumed items
wikitext
text/x-wiki
In the caves on the [[Zaheer island|island]] used by [[gnoll]]s to summon [[demon]]s, the party wandered into a chamber filled the bones of people who died violently, presumably those killed by the wolf demon. [[Anrel]] found a [[Ingen's satchel|satchel]] that he recognized as having belonged to [[Ingen Persson]], a soldier formerly under his command who he'd believed died [[Ùrlar Valley|seven years earlier]]. Inside the satchel, Anrel found items that he also recognized as belonging to <b>Ingen</b>: a [[Ingen's journal|leatherbound journal]], a [[Ingen's thieves' tools|set of thieves' tools]], and a vial of nearly transparent liquid, all of which Anrel picked up.
While hiding from ape-bodied, bat-faced, boar-sounding demons behind an [[Silent Image|illusory]] rockface cast by [[Grokko]], Anrel used a taste test to identify the transparent liquid as a <b>potion of invisibility</b>.
Not long thereafter, Grokko consumes the potion to scout the entire north-western wing of the temple of [[Zaheer]]. He almost immediately steps on a pressure tile that activates a poison dart that strikes him, making [[Vichthart]] believe Grokko is in danger (due to their [[Warding Bond]]). Vichthart and Anrel rush to Grokko's aid, which annoys Grokko because it needlessly squanders the stealth they were aiming for.
After Grokko confirms he's safe, he continues scouting, and fortunately the misunderstanding doesn't seem to have alerted anything to their presence. He follows corridors to locate the last two [[throat]] rooms as well as a jail holding several captives (including [[Celia]] and [[Preston]]).
{{Items}}
[[Category:Potions]]
[[Category:Items held by Anrel]]
[[Category:Items previously held by Ingen Persson]]
[[Category:Consumed items]]
13ebf129b623410140422c8e400df9875326336f
Spell scroll of Lightning Lure
0
357
637
2024-05-06T21:08:28Z
Vicht
1
Created page with "On the [[Zaheer island|island]] used by [[gnoll]]s to summon [[demon]]s, the party found an unoccupied bunkroom in the southeast of the mountain temple, which [[Anrel]] unlocked using the [[Chime of Opening]]. There were four bedrolls to the south and a single bed against the northeast wall. While Anrel stood guard by a set of steps leading up from the northern corner of the room, [[Vichthart]] and [[Grokko]] searched the room. Underneath the bed to the north they found..."
wikitext
text/x-wiki
On the [[Zaheer island|island]] used by [[gnoll]]s to summon [[demon]]s, the party found an unoccupied bunkroom in the southeast of the mountain temple, which [[Anrel]] unlocked using the [[Chime of Opening]]. There were four bedrolls to the south and a single bed against the northeast wall. While Anrel stood guard by a set of steps leading up from the northern corner of the room, [[Vichthart]] and [[Grokko]] searched the room.
Underneath the bed to the north they found a small chest containing [[Rrekkeh's journal]], a [[drift globe]], <b>carved bones</b>, and a rolled up piece of parchment, which Grokko unfurls and sees is a <b>spell scroll of Lightning Lure</b>, then passes to Anrel.
On [[Timeline|29 Thirkuoss]], Anrel used the spell scroll of Lightning Lure while fighting [[Srir Silthallow]], [[Rrekkeh Stormcrawler]], [[gnoll]] cultists and several summoned [[demon]]s at the summit of the Zaheer mountain temple. The spell did not work, and the scroll disintegrated.
{{Items}}
[[Category:Items previously held by Anrel]]
[[Category:Consumed items]]
[[Category:Spell scrolls]]
4bbebc885fecb9ea22209b3deacbc7cfe8c6fc2c
Bottled breath
0
358
638
2024-05-06T22:00:23Z
Vicht
1
Created page with "Underneath the [[gnoll encampment]] in [[Aleph Marsh]], while [[Vichthart]] was unconscious from a fight with a [[gnoll]] packlord and its bodyguards that they wrongly believed to be [[Srir Silthallow]], [[Anrel]] and [[Grokko]] explored a bunkroom to the northeast. Underneath the bed next to the table they found a strongbox, which Grokko opened, taking piercing and poison damage from the needle trap that caught him unaware. Inside the strongbox he found 46 silver piece..."
wikitext
text/x-wiki
Underneath the [[gnoll encampment]] in [[Aleph Marsh]], while [[Vichthart]] was unconscious from a fight with a [[gnoll]] packlord and its bodyguards that they wrongly believed to be [[Srir Silthallow]], [[Anrel]] and [[Grokko]] explored a bunkroom to the northeast. Underneath the bed next to the table they found a strongbox, which Grokko opened, taking piercing and poison damage from the needle trap that caught him unaware.
Inside the strongbox he found 46 silver pieces, 22 gold pieces, a [[garnet choker]], a [[banded agate]], an [[eye agate]], a [[obsidian shard|shard of obsidian]], and a small bottle with a liquid inside that looked lighter than water, almost gaseous. Anrel tasted this potion and identified it as <b>bottled breath</b>.
{{Items}}
[[Category:Items held by Anrel]]
[[Category:Potions]]
5fb998fc4dc50ce69b74819a58b2452769a739c6
639
638
2024-05-06T22:04:10Z
Vicht
1
Simplified banded and eye agates into one mineral link
wikitext
text/x-wiki
Underneath the [[gnoll encampment]] in [[Aleph Marsh]], while [[Vichthart]] was unconscious from a fight with a [[gnoll]] packlord and its bodyguards that they wrongly believed to be [[Srir Silthallow]], [[Anrel]] and [[Grokko]] explored a bunkroom to the northeast. Underneath the bed next to the table they found a strongbox, which Grokko opened, taking piercing and poison damage from the needle trap that caught him unaware.
Inside the strongbox he found 46 silver pieces, 22 gold pieces, a [[garnet choker]], two [[agate]] gemstones, a [[obsidian shard|shard of obsidian]], and a small bottle with a liquid inside that looked lighter than water, almost gaseous. Anrel tasted this potion and identified it as <b>bottled breath</b>.
{{Items}}
[[Category:Items held by Anrel]]
[[Category:Potions]]
426a2132bc003fc5d8baaefa27a02dc45723a66a
Agate
0
359
640
2024-05-06T22:07:45Z
Vicht
1
Created page with "Underneath the [[gnoll encampment]] in [[Aleph Marsh]], while [[Vichthart]] was unconscious from a fight with a [[gnoll]] packlord and its bodyguards that they wrongly believed to be [[Srir Silthallow]], [[Anrel]] and [[Grokko]] explored a bunkroom to the northeast. Underneath the bed next to the table they found a strongbox, which Grokko opened, taking piercing and poison damage from the needle trap that caught him unaware. Inside the strongbox he found 46 silver piece..."
wikitext
text/x-wiki
Underneath the [[gnoll encampment]] in [[Aleph Marsh]], while [[Vichthart]] was unconscious from a fight with a [[gnoll]] packlord and its bodyguards that they wrongly believed to be [[Srir Silthallow]], [[Anrel]] and [[Grokko]] explored a bunkroom to the northeast. Underneath the bed next to the table they found a strongbox, which Grokko opened, taking piercing and poison damage from the needle trap that caught him unaware.
Inside the strongbox he found 46 silver pieces, 22 gold pieces, a [[garnet choker]], a [[obsidian shard|shard of obsidian]], [[bottled breath]], and two translucent gemstones, one striped brown and the other with circles of blue.
On [[Timeline|19 Thelliea]], while the party was sorting their belongings, these gemstones were identified. The brown one was a <b>banded agate</b> and the blue one was an <b>eye agate</b>.
{{Items}}
[[Category:Items held by Grokko]]
[[Category:Minerals]]
dce932086149a0a6338c96951d212024cd4d01da
643
640
2024-05-06T22:53:23Z
Vicht
1
Changed Category:Minerals to Category:Mineral items
wikitext
text/x-wiki
Underneath the [[gnoll encampment]] in [[Aleph Marsh]], while [[Vichthart]] was unconscious from a fight with a [[gnoll]] packlord and its bodyguards that they wrongly believed to be [[Srir Silthallow]], [[Anrel]] and [[Grokko]] explored a bunkroom to the northeast. Underneath the bed next to the table they found a strongbox, which Grokko opened, taking piercing and poison damage from the needle trap that caught him unaware.
Inside the strongbox he found 46 silver pieces, 22 gold pieces, a [[garnet choker]], a [[obsidian shard|shard of obsidian]], [[bottled breath]], and two translucent gemstones, one striped brown and the other with circles of blue.
On [[Timeline|19 Thelliea]], while the party was sorting their belongings, these gemstones were identified. The brown one was a <b>banded agate</b> and the blue one was an <b>eye agate</b>.
{{Items}}
[[Category:Items held by Grokko]]
[[Category:Mineral items]]
900fb9291956e88895e7d241855e8439d2355714
Obsidian shard
0
360
642
2024-05-06T22:50:44Z
Vicht
1
Created page with "Underneath the [[gnoll encampment]] in [[Aleph Marsh]], while [[Vichthart]] was unconscious from a fight with a [[gnoll]] packlord and its bodyguards that they wrongly believed to be [[Srir Silthallow]], [[Anrel]] and [[Grokko]] explored a bunkroom to the northeast. Underneath the bed next to the table they found a strongbox, which Grokko opened, taking piercing and poison damage from the needle trap that caught him unaware. Inside the strongbox he found 46 silver piece..."
wikitext
text/x-wiki
Underneath the [[gnoll encampment]] in [[Aleph Marsh]], while [[Vichthart]] was unconscious from a fight with a [[gnoll]] packlord and its bodyguards that they wrongly believed to be [[Srir Silthallow]], [[Anrel]] and [[Grokko]] explored a bunkroom to the northeast. Underneath the bed next to the table they found a strongbox, which Grokko opened, taking piercing and poison damage from the needle trap that caught him unaware.
Inside the strongbox he found 46 silver pieces, 22 gold pieces, a [[garnet choker]], [[bottled breath]], two [[agate]] gemstones, and a small <b>shard of obsidian</b> with a green sheen. Grokko knows that obsidian is very rare, but had recently seen some in [[Jenora Greenheart's belt buckle]].
{{Items}}
[[Category:Items held by Grokko]]
[[Category:Minerals]]
7347d5535e8bf379a77bab4b7b524072cbfcc4a6
644
642
2024-05-06T22:53:30Z
Vicht
1
Changed Category:Minerals to Category:Mineral items
wikitext
text/x-wiki
Underneath the [[gnoll encampment]] in [[Aleph Marsh]], while [[Vichthart]] was unconscious from a fight with a [[gnoll]] packlord and its bodyguards that they wrongly believed to be [[Srir Silthallow]], [[Anrel]] and [[Grokko]] explored a bunkroom to the northeast. Underneath the bed next to the table they found a strongbox, which Grokko opened, taking piercing and poison damage from the needle trap that caught him unaware.
Inside the strongbox he found 46 silver pieces, 22 gold pieces, a [[garnet choker]], [[bottled breath]], two [[agate]] gemstones, and a small <b>shard of obsidian</b> with a green sheen. Grokko knows that obsidian is very rare, but had recently seen some in [[Jenora Greenheart's belt buckle]].
{{Items}}
[[Category:Items held by Grokko]]
[[Category:Mineral items]]
17f610c39b65fabc873653bf37ab3b1c5d102a88
Fancy pen
0
361
645
2024-05-06T23:38:18Z
Vicht
1
Created page with "On the night of [[Timeline|14 Thelliea]], the party broke into the [[Valiant Morgen Trading Company Kaarst Branch]] with the accompaniment of [[Orianna]]. Down the first corridor from the building's rear exit, Mira stuck his head into one of the four doors and swiped a <b>fancy pen</b>. When he returned, the rest of the party questioned him about anything he'd taken, to which Orianna shakes her head in dismay. == Vastren == The next evening, the party defeated the Kni..."
wikitext
text/x-wiki
On the night of [[Timeline|14 Thelliea]], the party broke into the [[Valiant Morgen Trading Company Kaarst Branch]] with the accompaniment of [[Orianna]]. Down the first corridor from the building's rear exit, Mira stuck his head into one of the four doors and swiped a <b>fancy pen</b>. When he returned, the rest of the party questioned him about anything he'd taken, to which Orianna shakes her head in dismay.
== Vastren ==
The next evening, the party defeated the [[Knives of Mystra]] and the [[bone devil]] underneath [[Kaarst]]. Afterwards, [[Mira]] and [[Grokko]] went to [[Vastren]] in the catacomb beneath the [[Spire of Conjuration]], ostensibly to get more information from her about what she had talked to the Knives of Mystra about.
After negotiation, they came to a deal with Vastren that she would tell them everything that she had done for [[Etorn Hadaran]], then they would release her from her magical bindings, then she would provide a token of appreciation to Mira and immediately depart to [[Nessus]]. Furthermore, if she was not released within one minute of providing her information, or if any hostile action was taken after she was freed, then the deal would become null and void, and she would be free to slay them both and take their souls.
Once Mira and Grokko were sure she was not lying to them, they agreed to the deal, and in front of each of them appeared a parchment scrool in a small burst of flame. Mira uses his fancy pen and [[devil blood ink|red ink]] stolen from Valiant Morgen to sign the scroll, then lends his pen to Grokko to do the same. Their signatures singe on the documents, which then curl up and disappear in a puff of fire. Mira takes back his fancy pen.
{{Items}}
[[Category:Items held by Mira]]
73f8bba1fec80fcbad6297523cff6dc14d30f5f9
647
645
2024-05-06T23:41:41Z
Vicht
1
Corrected spelling of scroll, fixed past tense in final paragraph
wikitext
text/x-wiki
On the night of [[Timeline|14 Thelliea]], the party broke into the [[Valiant Morgen Trading Company Kaarst Branch]] with the accompaniment of [[Orianna]]. Down the first corridor from the building's rear exit, Mira stuck his head into one of the four doors and swiped a <b>fancy pen</b>. When he returned, the rest of the party questioned him about anything he'd taken, to which Orianna shakes her head in dismay.
== Vastren ==
The next evening, the party defeated the [[Knives of Mystra]] and the [[bone devil]] underneath [[Kaarst]]. Afterwards, [[Mira]] and [[Grokko]] went to [[Vastren]] in the catacomb beneath the [[Spire of Conjuration]], ostensibly to get more information from her about what she had talked to the Knives of Mystra about.
After negotiation, they came to a deal with Vastren that she would tell them everything that she had done for [[Etorn Hadaran]], then they would release her from her magical bindings, then she would provide a token of appreciation to Mira and immediately depart to [[Nessus]]. Furthermore, if she was not released within one minute of providing her information, or if any hostile action was taken after she was freed, then the deal would become null and void, and she would be free to slay them both and take their souls.
Once Mira and Grokko were sure she was not lying to them, they agreed to the deal, and in front of each of them appeared a parchment scroll in a small burst of flame. Mira used his fancy pen and [[devil blood ink|red ink]] stolen from Valiant Morgen to sign the scroll, then lent his pen to Grokko to do the same. Their signatures singed on the documents, which then curled up and disappeared in a puff of fire. Mira took back his fancy pen.
{{Items}}
[[Category:Items held by Mira]]
7eb2570fc23cd29e3bf3a491e47a1dc8b7383870
Garnet choker
0
362
646
2024-05-06T23:39:53Z
Vicht
1
Created page with "Underneath the [[gnoll encampment]] in [[Aleph Marsh]], while [[Vichthart]] was unconscious from a fight with a [[gnoll]] packlord and its bodyguards that they wrongly believed to be [[Srir Silthallow]], [[Anrel]] and [[Grokko]] explored a bunkroom to the northeast. Underneath the bed next to the table they found a strongbox, which Grokko opened, taking piercing and poison damage from the needle trap that caught him unaware. Inside the strongbox he found 46 silver piece..."
wikitext
text/x-wiki
Underneath the [[gnoll encampment]] in [[Aleph Marsh]], while [[Vichthart]] was unconscious from a fight with a [[gnoll]] packlord and its bodyguards that they wrongly believed to be [[Srir Silthallow]], [[Anrel]] and [[Grokko]] explored a bunkroom to the northeast. Underneath the bed next to the table they found a strongbox, which Grokko opened, taking piercing and poison damage from the needle trap that caught him unaware.
Inside the strongbox he found 46 silver pieces, 22 gold pieces, a [[obsidian shard|shard of obsidian]], [[bottled breath]], two [[agate]] gemstones, and an elaborate gold chain <b>choker decorated with garnets</b>.
{{Items}}
[[Category:Items held by Grokko]]
6c5607f1cce3587f461606e84fceea32b5fe3ca6
Black hair dye
0
363
648
2024-05-07T00:35:35Z
Vicht
1
Created page with "As the party travelled from [[Senneborn]] to [[Kaarst]] by boat from [[Timeline|1 Thelliea to 10 Thelliea]], [[Anrel]] attempted to create a disguise for himself in order to remain unrecognized by anyone he'd previously known there. He attempted to complete his disguise with <b>black hair dye</b> and makeup, but the end result was not terribly convincing. == Buying more hair dye == On 14 Thelliea, the party prepared to leave [[The Copper Roost]] for Kaarst City Watch..."
wikitext
text/x-wiki
As the party travelled from [[Senneborn]] to [[Kaarst]] by boat from [[Timeline|1 Thelliea to 10 Thelliea]], [[Anrel]] attempted to create a disguise for himself in order to remain unrecognized by anyone he'd previously known there. He attempted to complete his disguise with <b>black hair dye</b> and makeup, but the end result was not terribly convincing.
== Buying more hair dye ==
On 14 Thelliea, the party prepared to leave [[The Copper Roost]] for [[Kaarst City Watch Headquarters]] to interrogate the members of the [[Knives of Mystra]] they'd captured the night before. [[Vichthart]] mentioned to [[Anrel]] that he wanted to visit [[Kade Sirrine Kathedrale]] that day to ask why magic is banned in the city, and knowing that Anrel is trying to go unrecognized by members of the church, suggested that he could find something else to do at that time. Anrel mused that he needed to buy some new black hair dye because his previous application was starting to fade.
When the party finally departed together, Anrel was immediately distracted by a cosmetics shop and entered to buy black hair dye. Everyone else waited outside, especially [[Mira]] who had just seriously upset the shopkeep that morning by attempting very badly to haggle down the price of various items that he wanted to create a disguise for [[Uthan]].
The owner told Anrel that the price of black hair dye was 5 gold pieces, causing Anrel to remember that he doesn't carry any money, so he excuses himself from the shop saying he had left his wallet at home. Outside, Vichthart gave Anrel the 5 gold pieces, and Anrel returned inside to purchase the black hair dye, saying it turned out he did have his wallet on him after all.
== Losing the hair dye ==
Shortly before sunset on 15 Thelliea, the party found themselves fighting a [[bone devil]] underneath Kaarst. After being at the receiving end of [[Grokko]]'s [[Bend Luck]] spell, and failing to smash barrel of [[ashfire oil]] against it, Anrel grappled the devil and forced it over the edge of the cobble island and into the raging waters below. It retaliated by stinging him and filling him with poison, causing Anrel to sink into the water.
While unconscious, Anrel held a conversation with what seemed to be [[Zaheer]], which resulted in his waking up feeling strong, with electricity coursing across the surface of his armour. He used his strength to grow luminous wings of crackling lightning from his back, and used those to fly himself (and Grokko) into the air, where he dealt final devastating blows against the bone devil, finally killing it.
Although Anrel then passed out, lost his wings and fell to the ground, when he first came to his body had been changed in a few ways, not all of which he immediately noticed. His arms were covered in spiderweb scars, his eyes previously bright yellow had acquired a blue tinge, and the black dye had been burnt out of his hair.
{{Items}}
[[Category:Items held by Anrel]]
6bffbaad1e9b480b03c96bc1bcb1d11f7aa31c74
Strawberry jam
0
364
649
2024-05-07T01:27:21Z
Vicht
1
Created page with "On [[Timeline|12 Thelliea]], the party investigated [[Kobolwitz Manor]]. Connected to the kitchen was a pantry filled with pots, saltboxes, the earthy smell of rotted fruits and vegetables, and jars of preserves. Mira took two jars of <b>strawberry jam</b>. Also in the pantry was a small bottle of pale brown pills, which [[Vichthart]] determined to be a month's supply of herbal remedy, but couldn't identify their purpose. [[Anrel]] determined that they taste bitter. The..."
wikitext
text/x-wiki
On [[Timeline|12 Thelliea]], the party investigated [[Kobolwitz Manor]]. Connected to the kitchen was a pantry filled with pots, saltboxes, the earthy smell of rotted fruits and vegetables, and jars of preserves. Mira took two jars of <b>strawberry jam</b>.
Also in the pantry was a small bottle of pale brown pills, which [[Vichthart]] determined to be a month's supply of herbal remedy, but couldn't identify their purpose. [[Anrel]] determined that they taste bitter. They did not take the pill bottle, although Mira secretly removed <b>five of the pills</b> and placed them into one of the jars of [[Tainted strawberry jam|strawberry jam]]. Mira then also stole a jaw of [[snozberry jam]] and a jar of [[lemon curd]]. He later also stole a jar of [[pickled onions]].
The next day, while travelling from [[Captain Felosiel Teinithra's house]] to the [[Waterworks Guild Headquarters]], Mira offered one of his jars of strawberry jam to Anrel, but received only a death glare in response, so backed down.
On 14 Thelliea, the party spoke to an administrator of the harbourmaster's office, hoping to learn the location where <i class="ship">[[Hope's Prize]]</i> was docked. Mira gave him the untainted jar of strawberry jam with a wink, to which the administrator responded sternly with ‘Attempts to bribe city officials don't tend to fly under the radar.’ Mira protested his innocence, claiming ‘I just thought you were cute!’
{{Items}}
[[Category:Items previously held by Mira]]
[[Category:Preserved food]]
221b0384c9eff1f9553e107c82bc394e97df4056
650
649
2024-05-07T01:30:57Z
Vicht
1
Removed bold effect from text relating to the tainted strawberry jam, as this article is about the untainted strawberry jam
wikitext
text/x-wiki
On [[Timeline|12 Thelliea]], the party investigated [[Kobolwitz Manor]]. Connected to the kitchen was a pantry filled with pots, saltboxes, the earthy smell of rotted fruits and vegetables, and jars of preserves. Mira took two jars of <b>strawberry jam</b>.
Also in the pantry was a small bottle of pale brown pills, which [[Vichthart]] determined to be a month's supply of herbal remedy, but couldn't identify their purpose. [[Anrel]] determined that they taste bitter. They did not take the pill bottle, although Mira secretly removed five of the pills and placed them into one of the jars of [[Tainted strawberry jam|strawberry jam]]. Mira then also stole a jaw of [[snozberry jam]] and a jar of [[lemon curd]]. He later also stole a jar of [[pickled onions]].
The next day, while travelling from [[Captain Felosiel Teinithra's house]] to the [[Waterworks Guild Headquarters]], Mira offered one of his jars of strawberry jam to Anrel, but received only a death glare in response, so backed down.
On 14 Thelliea, the party spoke to an administrator of the harbourmaster's office, hoping to learn the location where <i class="ship">[[Hope's Prize]]</i> was docked. Mira gave him the untainted jar of strawberry jam with a wink, to which the administrator responded sternly with ‘Attempts to bribe city officials don't tend to fly under the radar.’ Mira protested his innocence, claiming ‘I just thought you were cute!’
{{Items}}
[[Category:Items previously held by Mira]]
[[Category:Preserved food]]
8be73eee7293f6860dc62d346683e7c2b6472dd8
Tainted strawberry jam
0
365
651
2024-05-07T01:33:28Z
Vicht
1
Created page with "On [[Timeline|12 Thelliea]], the party investigated [[Kobolwitz Manor]]. Connected to the kitchen was a pantry filled with pots, saltboxes, the earthy smell of rotted fruits and vegetables, and jars of preserves. Mira took two jars of [[strawberry jam]]. Also in the pantry was a small bottle of [[Ser Reginald Kobolwitz's medication|pale brown pills]], which [[Vichthart]] determined to be a month's supply of herbal remedy, but couldn't identify their purpose. [[Anrel]] d..."
wikitext
text/x-wiki
On [[Timeline|12 Thelliea]], the party investigated [[Kobolwitz Manor]]. Connected to the kitchen was a pantry filled with pots, saltboxes, the earthy smell of rotted fruits and vegetables, and jars of preserves. Mira took two jars of [[strawberry jam]].
Also in the pantry was a small bottle of [[Ser Reginald Kobolwitz's medication|pale brown pills]], which [[Vichthart]] determined to be a month's supply of herbal remedy, but couldn't identify their purpose. [[Anrel]] determined that they tasted bitter. They did not take the pill bottle, although Mira secretly removed five of the pills and placed them into one of the jars to create a <b>tainted strawberry jam</b>. Mira then also stole a jar of [[snozberry jam]] and a jar of [[lemon curd]]. He later also stole a jar of [[pickled onions]].
On 19 Thelliea, while the party was sorting their belongings, Mira discovered with disappointment that, because he'd opened it, his tainted strawberry jam had started to go mouldy.
{{Items}}
[[Category:Items held by Mira]]
[[Category:Preserved food]]
fe7384b49b7b304413104134af38b6980b7bac21
Strawberry jam
0
364
652
650
2024-05-07T01:36:28Z
Vicht
1
Added link to Ser Reginald Kobolwitz's medication
wikitext
text/x-wiki
On [[Timeline|12 Thelliea]], the party investigated [[Kobolwitz Manor]]. Connected to the kitchen was a pantry filled with pots, saltboxes, the earthy smell of rotted fruits and vegetables, and jars of preserves. Mira took two jars of <b>strawberry jam</b>.
Also in the pantry was a small bottle of [[Ser Reginald Kobolwitz's medication|pale brown pills]], which [[Vichthart]] determined to be a month's supply of herbal remedy, but couldn't identify their purpose. [[Anrel]] determined that they taste bitter. They did not take the pill bottle, although Mira secretly removed five of the pills and placed them into one of the jars of [[Tainted strawberry jam|strawberry jam]]. Mira then also stole a jaw of [[snozberry jam]] and a jar of [[lemon curd]]. He later also stole a jar of [[pickled onions]].
The next day, while travelling from [[Captain Felosiel Teinithra's house]] to the [[Waterworks Guild Headquarters]], Mira offered one of his jars of strawberry jam to Anrel, but received only a death glare in response, so backed down.
On 14 Thelliea, the party spoke to an administrator of the harbourmaster's office, hoping to learn the location where <i class="ship">[[Hope's Prize]]</i> was docked. Mira gave him the untainted jar of strawberry jam with a wink, to which the administrator responded sternly with ‘Attempts to bribe city officials don't tend to fly under the radar.’ Mira protested his innocence, claiming ‘I just thought you were cute!’
{{Items}}
[[Category:Items previously held by Mira]]
[[Category:Preserved food]]
e74a3f08f8d78a545c72a241439bf2eb924e2f78
Snozberry jam
0
366
653
2024-05-07T01:48:27Z
Vicht
1
Created page with "On [[Timeline|12 Thelliea]], the party investigated [[Kobolwitz Manor]]. Connected to the kitchen was a pantry filled with pots, saltboxes, the earthy smell of rotted fruits and vegetables, and jars of preserves. Mira took two jars of [[strawberry jam]]. Also in the pantry was a small bottle of [[Ser Reginald Kobolwitz's medication|pale brown pills]], which [[Vichthart]] determined to be a month's supply of herbal remedy, but couldn't identify their purpose. [[Anrel]] d..."
wikitext
text/x-wiki
On [[Timeline|12 Thelliea]], the party investigated [[Kobolwitz Manor]]. Connected to the kitchen was a pantry filled with pots, saltboxes, the earthy smell of rotted fruits and vegetables, and jars of preserves. Mira took two jars of [[strawberry jam]].
Also in the pantry was a small bottle of [[Ser Reginald Kobolwitz's medication|pale brown pills]], which [[Vichthart]] determined to be a month's supply of herbal remedy, but couldn't identify their purpose. [[Anrel]] determined that they tasted bitter. They did not take the pill bottle, although Mira secretly removed five of the pills and placed them into one of the jars to create a [[tainted strawberry jam]]. Mira then also stole a jar of <b>snozberry jam</b> and a jar of [[lemon curd]]. He later also stole a jar of [[pickled onions]].
Later that night, they returned to [[Squall's Beacon]] and spoke to [[Amnon Ingolidan]]. To apologize for earlier in the day breaking into the lighthouse using Anrel's [[Chime of Opening]], Mira gifted Amnon with his stolen jar of snozberry jam. While Amnon was giving them a tour of Squall's Beacon, he placed the jar into a cupboard in the kitchen on the second floor.
{{Items}}
[[Category:Items previously held by Mira]]
[[Category:Preserved food]]
b76dfe6a0196521ca306d05cd5d80f01fff28600
Drift globe
0
347
654
634
2024-05-07T01:52:24Z
Vicht
1
Corrected link from crossbows to crossbow bolt
wikitext
text/x-wiki
== Zaheer island ==
On the [[Zaheer island|island]] used by [[gnoll]]s to summon [[demon]]s, the party found an unoccupied bunkroom in the southeast of the mountain temple, which [[Anrel]] unlocked using the [[Chime of Opening]]. There were four bedrolls to the south and a single bed against the northeast wall. While Anrel stood guard by a set of steps leading up from the northern corner of the room, [[Vichthart]] and [[Grokko]] searched the room.
Underneath the bed to the north they found a small chest containing a [[spell scroll of Lightning Lure]], [[carved bones]], [[Rrekkeh's journal]], and a small, warm sphere of thick glass. Up the stairs to the north they found a separate bunkroom where [[Srir Silthallow]]'s bed was alone. Underneath it the party found a wooden chest, which Anrel smashed open. Inside that was a [[Bag of Holding]], into which the glass sphere was placed.
== Kobolwitz Manor ==
On [[Timeline|12 Thelliea]], the party explored [[Kobolwitz Manor]]. Eventually they figured out how to open the entrance to a secret chamber behind a wine rack in [[Ser Reginald Kobolwitz]]'s wine cellar. Inside they found the body of a [[Esker|dead human man]] in a pool of dried blood, thieves' tools scattered on the floor, a wall mount for [[Ser Kobolwitz's scimitar]], and a wooden crate.
[[Anrel]] and [[Mira]] dragged the crate out of the secret room and into the wine cellar. Mira readied his own [[Mira's thieves' tools|thieves' tools]] only to find the crate was already unlocked, then used [[Mage Hand]] to lift the lid. Inside the crate were numerous leather pouches containing vast sums of wealth, a bundle of three [[crossbow bolt]]s tied up in string, a glass vial containing a [[Potion of animal friendship|muddy-looking liquid]], and a small sphere of thick glass with blue tint.
[[Vichthart]] was the first to pick up the glass sphere, which he determined was magical by the warmth of its touch. He threw it to Anrel, who threw it to [[Grokko]], who took it upstairs in Kobolwitz Manor to inspect it. Grokko determined it to be a <b>drift globe</b>, which is capable of casting light, floating, and following an individual.
Mira wanted to take these items, but the others pointed out that they were exploring a crime scene, and they should leave them for the authorities. They took the crate and left it (and all of the items from it) on the dining room table.
== Debrief ==
On 19 Thelliea, the [[Galesong Thervan Indále]] and [[Sable Warden Meriele Berevan]] held a final debrief with the party after their defeat of the [[Knives of Mystra]] and the [[bone devil]]. As part of the thanks for their accomplishment, they presented the party with several items, including those the party had found in Kobolwitz Manor. They were told that while they did well to hand them in, [[Kaarst]] would only arrange for them to be removed from the city, and taking the items would save them the paperwork.
The party spent time deciding how to share these items amongst themselves. They also took the opportunity to examine the glass sphere found beneath [[Rrekkeh Stormcrawler]]'s bed, identifying it as another drift globe. They agreed that both drift globes should go to Vichthart because all three others inherently benefitted from darkvision.
{{Items}}
[[Category:Items held by Vichthart]]
[[Category:Items previously in the Bag of Holding]]
[[Category:Magical items]]
6ffd4c1ab6e8f7d3474aac1f1258ec7b50b950df
Pickled onions
0
367
655
2024-05-07T02:00:12Z
Vicht
1
Created page with "On [[Timeline|12 Thelliea]], the party investigated [[Kobolwitz Manor]]. Connected to the kitchen was a pantry filled with pots, saltboxes, the earthy smell of rotted fruits and vegetables, and jars of preserves. Mira took two jars of [[strawberry jam]]. Also in the pantry was a small bottle of [[Ser Reginald Kobolwitz's medication|pale brown pills]], which [[Vichthart]] determined to be a month's supply of herbal remedy, but couldn't identify their purpose. [[Anrel]] d..."
wikitext
text/x-wiki
On [[Timeline|12 Thelliea]], the party investigated [[Kobolwitz Manor]]. Connected to the kitchen was a pantry filled with pots, saltboxes, the earthy smell of rotted fruits and vegetables, and jars of preserves. Mira took two jars of [[strawberry jam]].
Also in the pantry was a small bottle of [[Ser Reginald Kobolwitz's medication|pale brown pills]], which [[Vichthart]] determined to be a month's supply of herbal remedy, but couldn't identify their purpose. [[Anrel]] determined that they tasted bitter. They did not take the pill bottle, although Mira secretly removed five of the pills and placed them into one of the jars to create a [[tainted strawberry jam]]. Mira then also stole a jar of [[snozberry jam]] and a jar of [[lemon curd]].
Eventually the party figured out how to open the entrance to a secret chamber behind a wine rack in [[Ser Reginald Kobolwitz]]'s wine cellar. Inside they found the body of a [[Esker|dead human man]] in a pool of dried blood, thieves' tools scattered on the floor, a wall mount for [[Ser Kobolwitz's scimitar]], and a wooden crate.
[[Anrel]] and [[Mira]] dragged the crate out of the secret room and into the wine cellar. Mira readied his own [[Mira's thieves' tools|thieves' tools]] only to find the crate was already unlocked, then used [[Mage Hand]] to lift the lid. Inside the crate were numerous leather pouches containing vast sums of wealth, a bundle of three [[crossbow bolt]]s tied up in string, a glass vial containing a [[Potion of animal friendship|muddy-looking liquid]], and a small [[Drift globe|sphere of thick glass]] with blue tint.
Mira wanted to take these items, but the others pointed out that they were exploring a crime scene, and they should leave them for the authorities. They took the crate and left it (and all of the items from it) on the dining room table. Out of spite, Mira returned to the pantry and stole a jar of <b>pickled onions</b>.
Later that night, they returned to [[Squall's Beacon]] and spoke to [[Amnon Ingolidan]]. While investigating the basement, Mira located a hollow-sounding section of floor and used his [[Mira's crowbar|crowbar]] to lift a flagstone to reveal a hidden passage. The party entered to explore, telling Amnon to remain where he was and not let anybody else in.
The party explored beneath Squall's Beacon for a few hours before returning to the basement, where Amnon was still waiting for them to return. Anrel determined to his satisfaction that Amnon was not aware of the passageway or anything beneath, and insisted that he kept anyone from enterting it until more authorities arrived to investigate further. Mira then gave Amnon his stolen jar of picked onions, which Amnon pocketed sheepishly.
{{Items}}
[[Category:Items previously held by Mira]]
[[Category:Preserved food]]
cc402159f9fc16179c4d0e0ec5a737c38da79a27
Etaf
0
368
656
2024-05-07T23:55:22Z
Vicht
1
Created page with "<b>Etaf</b> is a being that is held captive inside [[Mira's ring]]. [[Mira]] has had limited ability to communicate with him, but has done so during a dream on the night of [[Timeline|14 Thelliea]]. == Appearance == Etaf appeared in Mira's dream with tight braided locks adorned with ornaments, a ruby choker, and eyes with a dark orange glow. He was wearing fine slate grey robes and a fine silk shawl worn over his shoulder. His expression began impassive, then stern, but..."
wikitext
text/x-wiki
<b>Etaf</b> is a being that is held captive inside [[Mira's ring]]. [[Mira]] has had limited ability to communicate with him, but has done so during a dream on the night of [[Timeline|14 Thelliea]].
== Appearance ==
Etaf appeared in Mira's dream with tight braided locks adorned with ornaments, a ruby choker, and eyes with a dark orange glow. He was wearing fine slate grey robes and a fine silk shawl worn over his shoulder. His expression began impassive, then stern, but softened into something that could almost be a smile. As Mira told him about what he'd been through, his eyes burnt like coals with enraptured focus, although he remained stony faced.
When Mira met him in his dream, Etaf had a complex golden chain around each forearm, resembling a snake with its fangs sunk into his wrists, tight enough to see welts and deep enough to draw blood that ran down the chains holding him in place.
== History ==
Etaf is a prisoner in Mira's ring, although he doesn't know who did it to him or how, nor how to be freed. His only understanding is that his bindings syphon energy from him, and must have been created by somebody familiar with his kind.
Mira is trying to help Etaf, who has advised him to begin by learning more about the people he took the ring from, since they may know more about its creation or procurement. Mira has had only limited knowledge and interaction with Etaf.
After helping the party to search <i class="ship">[[Hope's Prize]]</i> and the [[Valian Morgen Trading Company Kaarst Branch]] on 14 Thelliea, Mira returned to the [[Baron's Cask]] to sleep. In his dream, Etaf taught him now techniques and skills, and advised him to do more to win over his new friends. They cannot stay in constant communication because Etaf needs to muster enough energy to contact him. In the meantime, Mira acts as his eyes and ears.
{{Characters}}
6013c1a0eb62a6f861f442ac0bf0aa1bab26fc19
Conflagracy
0
369
657
2024-05-08T00:08:04Z
Vicht
1
Created page with "The <b>Conflagracy</b> is the ruling power of the country of [[Dhintay]]. Part of its structure is a society of assassins, whose symbol is twin flames. When [[Mira]] recognized the symbol on the cover of one of the [[leatherbound books]] that [[Vichthart]] was collecting from the [[Acropolis of Kereskaa#Grand Library|Grand Library]], he asked to see it, and Vichthart handed it to him. When [[Mira]] showed [[Orianna]] the twinned flame symbol on the Book of the Twinne..."
wikitext
text/x-wiki
The <b>Conflagracy</b> is the ruling power of the country of [[Dhintay]]. Part of its structure is a society of assassins, whose symbol is twin flames.
When [[Mira]] recognized the symbol on the cover of one of the [[leatherbound books]] that [[Vichthart]] was collecting from the [[Acropolis of Kereskaa#Grand Library|Grand Library]], he asked to see it, and Vichthart handed it to him.
When [[Mira]] showed [[Orianna]] the twinned flame symbol on the [[Book of the Twinned Flame]], she recognized it having seen it on a piece of paper [[Arnuanna]] had had, which she said looked like a letter with a seal. Although Orianna had heard of Dhintay, she wasn't familiar with its government or how Arnuanna could be connected.
{{Characters}}
[[Category:Ruling powers]]
b6c297795f864d04e62217e74d0c4e1dd3785edf
Burning Lord
0
370
658
2024-05-08T00:18:45Z
Vicht
1
Created page with "According to the anonymous mage who authored the [[Book of the Twinned Flame]] that [[Mira]] took from the other [[leatherbound books]] that had survived the destruction of the [[Acropolis of Kereskaa]], The <b>Burning Lord</b> was a conquering champion in [[Calaha]]. Mira read about the figure in the book during the three days that followed the party's defeat of the [[Knives of Mystra]] and the [[bone devil]] underneath [[Kaarst]]. The author recounts the many, often c..."
wikitext
text/x-wiki
According to the anonymous mage who authored the [[Book of the Twinned Flame]] that [[Mira]] took from the other [[leatherbound books]] that had survived the destruction of the [[Acropolis of Kereskaa]], The <b>Burning Lord</b> was a conquering champion in [[Calaha]].
Mira read about the figure in the book during the three days that followed the party's defeat of the [[Knives of Mystra]] and the [[bone devil]] underneath [[Kaarst]]. The author recounts the many, often contradictory rumours about The Burning Lord, who is said to have weilded magical fire to defeat monsters across the deserts of Calaha. The rumours made different claims about the nature of the fire he weilded.
* Some rumours claimed he was a mage using arcane magic.
* Some rumours claimed he was a holy man using divine magic.
* Some rumours claimed the fire was allegorical.
Regardless of the specifics, The Burning Lord had become a local hero, and many people had flocked to his cause. The author of the book wrote of their plans to journey to Calaha and meet The Buring Lord, but the book does not answer whether this ended up taking place.
{{Characters}}
aa2fe1334e28a06b7fcdf280553a306f350776bc
Book of the Twinned Flame
0
172
659
297
2024-05-08T00:19:09Z
Vicht
1
Added Items navbox
wikitext
text/x-wiki
When the party enters the [[Acropolis_of_Kereskaa#Grand_Library|Grand Library]] of the Acropolis of Kereskaa, [[Vichthart]] collects several [[leatherbound books]] from a charred, rusted and grimy chest—the only surviving contents of the Library. Among them, [[Mira]] spots one <b>book with a red [[twinned flame]]</b> emblem on its cover, and asks for it from Vicht, who hands it over.
After retrieving the [[Obsidian Claw]] from the Acropolis vault, the party takes a short rest to prepare for what they'll find inside the [[Spire of Abjuration]]. During this time, Mira begins to read through the book he's found. He recognizes the script but not the language, though he can read it thanks to his [[Eyes of the Runekeeper]] eldritch invocation. It seems to be a journal by a mage recounting the rumours of a conquering champion who wielded divine fire, smiting the monsters that inhabit the deserts of [[Calaha]].
In the 3 days that follow their defeat of the [[bone devil]], Mira spends more time reading the book. The author is a mage but isn't identified in any way. They write about the rumours of a conquering champion called The [[Burning Lord]], who brandishes divine fire to defeat monsters across the Calaha desert. He is a local hero, with more and more people flocking to his cause, but there is no consensus on the nature of the hero's divine fire. Some rumours claim he is a mage using arcane magic, others claim he is a holy man, while still others talk about the fire being allegorical. The author is particularly interested in determining which of these is truest, and plans to journey to Calaha to meet the Burning Lord. However, the final pages do not conclude about whether this actually occurred.
Eventually someone is able to identify the language of the book for Mira. It is an old language with no particular name, used in Calaha before it died out and was replaced by modern languages that evolved from it.
{{Items}}
[[Category:Items held by Mira]]
[[Category:Written items]]
df955f5805e1fa631ca0572047a8755892f44766
Flat-bottomed ruby
0
167
660
286
2024-05-08T00:56:51Z
Vicht
1
wikitext
text/x-wiki
When the party broke into the [[Valiant Morgen Trading Company Kaarst Branch]] in the night of [[Timeline|14 Thelliea]], [[Anrel]] used his [[Chime of Opening]] to unlock the door into [[Irann Rhogar]]'s office. On his desk was a fancy desk lamp, a half rolled map of the [[Roughspun Coast]], and an impressive, cut <b>ruby with a flat bottom</b>.
[[Vichthart]] realized that looking through the ruby allowed the writing of [[Irann Rhogar's journal]] to be easily discerned. They later learnt that was because it was written using [[devil blood ink]], which normally only devils can see; however, this ruby allows the ink to be seen by anyone.
Before learning about the properties of devil blood ink, Vichthart tried to use the ruby to check for anything else that had been hidden from normal perception. He tried this elsewhere in the Kaarst Branch, and the next day when exploring the bedroom of the [[Nothic]]s in the [[Acropolis of Kereskaa]]. However, he discovered nothing new on either occasion.
== Appearance ==
The flat-bottomed ruby catches the moonlight in a very pleasing manner, and the colour of it is slightly too apparent for the level of darkness at which the party was exploring the building.
{{Items}}
[[Category:Items held by Vichthart]]
[[Category:Mineral items]]
8c357c2d3da9503b90db259da47ab0a9fe9c7bd0
Oil of Etherealness
0
371
661
2024-05-08T01:05:37Z
Vicht
1
Created page with "When the party broke into the [[Valiant Morgen Trading Company Kaarst Branch]] in the night of [[Timeline|14 Thelliea]], [[Anrel]] used his [[Chime of Opening]] to unlock the door into [[Irann Rhogar]]'s office. On his desk was a fancy desk lamp, a half rolled map of the [[Roughspun Coast]], and an impressive, cut [[Flat-bottomed ruby|ruby with a flat bottom]]. [[Mira]] opened a drawer in his desk and found behind a false back a single [[platinum piece]], an devil blo..."
wikitext
text/x-wiki
When the party broke into the [[Valiant Morgen Trading Company Kaarst Branch]] in the night of [[Timeline|14 Thelliea]], [[Anrel]] used his [[Chime of Opening]] to unlock the door into [[Irann Rhogar]]'s office. On his desk was a fancy desk lamp, a half rolled map of the [[Roughspun Coast]], and an impressive, cut [[Flat-bottomed ruby|ruby with a flat bottom]].
[[Mira]] opened a drawer in his desk and found behind a false back a single [[platinum piece]], an [[devil blood ink|inkwell with red ink]], a [[Irann Rhogar's journal|dogeared journal]], and a vial with cloudy,grey oil on the outside containing a completely transparent liquid. The liquid tasted to [[Vichthart]] faintly smoky, and it caused his mind to become cloudy. He kept this <b>Oil of Etherealness</b>.
{{Items}}
[[Category:Items held by Vichthart]]
[[Category:Potions]]
bb56edb2f84038abd3f28f756dec391c08770f73
Erdak
0
372
662
2024-05-12T13:22:17Z
Vicht
1
Created page with "A [[hobgoblin]] captain in [[Droghen's keep]]. [[Category:Hobgoblins]] [[Category:Criminals working for Droghen]]"
wikitext
text/x-wiki
A [[hobgoblin]] captain in [[Droghen's keep]].
[[Category:Hobgoblins]]
[[Category:Criminals working for Droghen]]
a02992246e60d86af162deb37be127d75bb5579e
665
662
2024-05-12T13:29:45Z
Vicht
1
Added Characters navbox
wikitext
text/x-wiki
A [[hobgoblin]] captain in [[Droghen's keep]].
{{Characters}}
[[Category:Hobgoblins]]
[[Category:Criminals working for Droghen]]
045a31b5e03fa10ce8fbc07991166382e700365c
Gurnin
0
373
663
2024-05-12T13:22:46Z
Vicht
1
Created page with "A [[bugbear]] in [[Droghen's keep]]. [[Category:Bugbears]] [[Category:Criminals working for Droghen]]"
wikitext
text/x-wiki
A [[bugbear]] in [[Droghen's keep]].
[[Category:Bugbears]]
[[Category:Criminals working for Droghen]]
29db7bacb5452f0bb909565b5173509773a7c360
666
663
2024-05-12T13:30:05Z
Vicht
1
Added Characters navbox
wikitext
text/x-wiki
A [[bugbear]] in [[Droghen's keep]].
{{Characters}}
[[Category:Bugbears]]
[[Category:Criminals working for Droghen]]
26250265a4a20184498d8b3d9b0f0eec914a057c
Template:Characters
10
147
664
571
2024-05-12T13:24:18Z
Vicht
1
Moved Erdak and Gurnin from Unknown to Droghen
wikitext
text/x-wiki
{{Navbox
| state = plain
| listclass = hlist
| title = Characters
| group1 = Heroes
| list1 =
{{Navbox|child
| group2 = An Arkhellen Adventure
| list2 =
* [[Grokko]]
* [[Kenneth]]
* [[Anrel]]
** [[Grimm]]
* [[Mira]]
** [[Etaf]]
* [[Vichthart]]
| group3 = [[The Piß Keepers]]
| list3 =
* [[Elias]]
* [[Grezz]]
* [[Cora Hothead]]
* [[Slabbledab]]
| group4 = Dragon Barrow
| list4 =
* [[Mai Dèanta]]
* [[Iagan Liath]]
* [[Ealar Sgàrlaid]]
* [[Tasgall Uaine]]
| group5 = Talyen Tales
| list5 =
* [[Elmar Grunmeier]]
* [[Tayana Ralovyre]]
* [[Verdec Sharakas]]
* [[Kuno Wirz]]
}} <!-- End Heroes -->
| group6 = [[Meeresdorf]]
| list6 =
* [[Barthon]]
* [[Bracka]]
* [[Solomon Dugraf]]
* [[Lania Falst]]
* [[Captain Gaardan Haupmann]]
* [[Marta Tierstärk]]
* [[Merric Tierstärk]]
| group7 = [[Senneborn]]
| list7 =
* [[St Anorad]]
* [[Judita Bandelmann]]
* [[Captain Eggehart]]
* [[Ogdavis]]
* [[Kerstin Pletscher]]
* [[Brumnir Torfelt]]
| group8 = [[:Category:Criminals working for Droghen|Droghen]]
| list8 =
* [[Arnt]]
* [[Bertrand]]
* [[Bezur]]
* [[Bill]]
* [[Davin]]
* [[Armine Detlef]]
* [[Droghen]]
* [[Erdak]]
* [[Falk]]
* [[Gurnin]]
* [[Hilta]]
* [[Jochim]]
* [[Knuth]]
* [[Ogak]]
* [[Spotter]]
* [[Swiper]]
* [[Talxa]]
* [[Tark]]
* [[Vantan]]
| group9 = [[Zaheer island|Island]]
| list9 =
* [[Beatrux]]
* [[Celia]]
* [[Heineer Doonan]]
* [[Kylian]]
* [[Preston]]
* [[Srir Silthallow]]
* [[Szehga Silthallow]]
* [[Rrekkeh Stormcrawler]]
* [[Watcher]]
* [[Prince Yunogu]]
| group10 = [[Roughspun Coast]]
| list10 =
* [[Jenora Greenheart]]
* [[Handy]]
* [[Irebi]]
* [[Mist]]
* [[Tatha]]
* [[Yks]]
| group11 = [[Verein Kirche von Arkhelle]]
| list11 =
* [[Sable Warden Meriele Berevan]]
* [[Black]]
* [[Father Traulam Eugen]]
* [[Fenwar Twins]]
* [[Decheimül Fezzilbahn]]
* [[Father Eivald Glissan]]
* [[Kham Gohlrim]]
* [[Holy Quorum]]
* [[Galesong Thervan Indále]]
* [[Pas]]
* [[Ingen Persson]]
* [[Cardinal Maurul Silkendawn]]
* [[Maghn Ünthergol]]
| group12 = [[Kaarst]]
| list12 =
{{Navbox|child
| group13 = [[Kaarst City Watch|City Watch]]
| list13 =
* [[Orryn Daergel]]
* [[Sergeant Therai Doudra]]
* [[Eren]]
* [[Hilde]]
* [[Lieutenant General Inafel]]
* [[Tamaran]]
* [[Captain Felosiel Teinithra]]
* [[Vanas]]
| group14 = [[Squall's Beacon]]
| list14 =
* [[Eldon Garrick]]
* [[Amnon Ingolidan]]
* [[Samus]]
* [[Eurgaran Wihta]]
* [[Heda Wihta]]
| group15 = [[Knives of Mystra]]
| list15 =
* [[Aran]]
* [[Etorn Hadaran]]
* [[Reiner Hoss]]
* [[Leagallow Tiaathque]]
* [[Uthan]]
* [[Yaan]]
| group16 = [[The Tide]]
| list16 =
* [[Arnuanna]]
* [[Esker]]
* [[Luther]]
* [[Orianna]]
* [[Rewyn]]
| group17 = [[Valiant Morgen Trading Company|Valiant Morgen]]
| list17 =
* [[Antoniya Brosch]]
* [[Heathress Erenbund]]
* [[Malte Faerber]]
* [[Captain Adran Mokam]]
* [[Caphri Pilc]]
* [[Irann Rhogar]]
* [[Anselm Teklanis]]
* [[Tilos]]
* [[Thava Windreaver]]
| group18 = [[Acropolis of Kereskaa]]
| list18 =
* [[Elgrex Anderra]]
* [[Cansa Cinsmic]]
* [[Befrir Dalovamri]]
* [[Henry Hungleberry]]
* [[Suithrathus Luirmo]]
* [[Teklanna Morantine]]
* [[Farlu Naenreh]]
* [[Toross Rhistel]]
* [[Vithra Rutgeth]]
* [[Vastren]]
| group19 = Other
| list19 =
* [[Achima]]
* [[Bogdan]]
* [[Bogdin]]
* [[Delilah]]
* [[Governor Escherin]]
* [[Ruda Frank]]
* [[Ginger]]
* [[Claira Hanali]]
* [[Ertus Heda]]
* [[Thodris Holderheck]]
* [[Ser Reginald Kobolwitz]]
* [[Xandahire Kobolwitz]]
* [[C. B. L.]]
* [[Elira Lein]]
* [[Lilly]]
* [[Administrator Lorsalyn Pri]]
* [[Tyrant]]
}} <!-- End Kaarst subsets -->
| group20 = [[Fuarcrùn Freeholds]]
| list20 =
* [[Draca]]
* [[Ingen]]
* [[Kaelinu]]
| group21 = [[Havenhaft]]
| list21 =
* [[Charles]]
* [[Eoin]]
* [[James]]
* [[Alafonz Kalazorn]]
* [[Shusk]]
| group22 = [[Bergstraßer]]
| list22 =
* [[Iron Fang]]
* [[Seebo]]
* [[Doug Zenner]]
| group23 = [[Arkhellen Empire]]
| list23 =
* [[Anastel]]
* [[King Lorenz Friedriche Arkhelle XVI]]
* [[Mistress Illefina]]
* [[Iron Tempest Mercenary Company]]
* [[Nikola]]
* [[Rosamund]]
| group24 = [[Calaha]]
| list24 =
* [[Burning Lord]]
* [[Conflagracy]]
| group25 = Gods
| list25 =
{{Navbox|child
| group26 = [[Verein Kirche von Arkhelle]]
| list26 =
* [[Avandra]]
* [[Bahamut]]
* [[Erathis]]
* [[Ioun]]
* [[Kord]]
* [[Moradin]]
* [[Mystra]]
* [[Pelor]]
* [[Raven Queen]]
* [[Sarenrae]]
* [[Selune]]
* [[Zaheer]]
| group27 = Other
| list27 =
* [[Bane]]
* [[Corellon]]
* [[Gruumsch]]
* [[Teli Monei]]
}} <!-- End of Gods -->
| group28 = Pseudonyms
| list28 =
* [[Etorn Hadaran|Ashmaker]]
* [[Suithrathus Luirmo|Mr Curtain]]
* [[Esker|E]]
* [[Anrel|Frank]]
* [[Grokko|Grokbert]]
* [[Szehga Silthallow|Gurta]]
* [[Szehga Silthallow|Haga]]
* [[Arnuanna|J]]
* [[Vichthart|Señor José]]
* [[Grokko|Julian]]
* [[Mystra|Kereskaa]]
* [[Kham]]
* [[Vichthart|Michael]]
* [[Grimm|Moose Knuckle]]
* [[Anrel|My Emotions Will Never Hurt Me]]
* [[Vichthart|Priest Man]]
* [[Kenneth|Stoneboy]]
* [[Grokko|Strangehands]]
* [[Orianna|V]]
| group29 = Unknown
| list29 =
* [[Billy-Bob Gene-Joel]]
* [[Evailen]]
* [[Jathnel]]
* [[Kinrel]]
* [[Florine Oakstein]]
}}
56360446974d2432e42a7da841a0f25edb2e7540
Delilah
0
374
667
2024-05-12T13:34:17Z
Vicht
1
Created page with "The eponym of [[Delilah's Delicatessen]]. {{Characters}} [[Category:Eponyms]]"
wikitext
text/x-wiki
The eponym of [[Delilah's Delicatessen]].
{{Characters}}
[[Category:Eponyms]]
411e315051bd8da42bec03177ea5fbd0a4c775c0
Template:Locations
10
148
668
591
2024-05-12T13:34:44Z
Vicht
1
Correcting spelling of Delicatessen
wikitext
text/x-wiki
{{Navbox
| state = plain
| listclass = hlist
| title = Locations
| group1 = Planes
| list1 =
* [[Nine Hells]]
** [[Nessus]]
* [[Feywild]]
| group2 = Bodies
| list2 =
* [[Asíl]]
* [[Ashtkhaan]]
{{Navbox|child
| group3 = [[Talyen]]
| list3 =
* [[Calaha]]
** [[Dhintay]]
* [[Eaos]]
* [[Savra]]
* [[Spanish]]
{{Navbox|child
| group4 = [[Elengon]]
| list4 =
* [[Fuarcrùn Freeholds]]
** [[Scierce]]
** [[Ùrlar Valley]]
* [[Ifkhamurud]]
* [[Kythera]]
* [[Leurisan]]
* [[Medinian Republic]]
* [[Rossaña]]
* [[Süddorn]]
* [[Sundering Sea]]
* [[Wüstenwast]]
{{Navbox|child
| group5 = [[Arkhellen Empire]]
| list5 =
* [[Arkhelle]]
** [[Baumeln]]
** [[Heldruh]]
** [[Hellenhelm]]
*** [[Basilica Endeavorant]]
*** [[Wesselbern Palast]]
* [[Brenhalt]]
** [[Kalazorn Ranch]]
** [[Bükerstadt]]
** [[Stolzfestung]]
* [[Denkrei]]
** [[Bergstraßer]]
*** [[The Vicious Crab]]
*** [[Mountain Iron]]
** [[Schmiedentruum]]
* [[Teremberg]]
* [[Vargesse]]
* [[Verrameln]]
* [[Würtzollen]]
** [[Ostweg-Treffen]]
{{Navbox|child
| group6 = [[Scharn]]
| list6 =
* [[Aern]]
* [[Heidestedt]]
* [[Roughspun Coast]]
* [[Salz Bay]]
* [[Scharnwald]]
{{Navbox|child
| group7 = [[Western Scharn]]
| list7 =
* [[Aleph Marsh]]
* [[Cralw]]
* [[Bacheim]]
* [[Darkwasser Wald]]
* [[Droghen's keep]]
* [[Gnoll encampment]]
* [[Zaheer island]]
* [[Kusen]]
* [[Löwenalt]]
* [[Salzreich]]
* [[Strandholm]]
* [[Wurzel Drain]]
* [[Wüsthafen]]
{{Navbox|child
| group8 = [[Meeresdorf]]
| list8 =
* [[Bear's End Inn]]
* [[Blue Birch Costermonger]]
* [[The Dauntless Shield]]
| group9 = [[Senneborn]]
| list9 =
* [[Broken Thorn]]
* [[Church of St Anarad]]
* [[The Katz und Imp]]
* [[Ogdavis' Apotheker]]
* [[Ratway]]
* [[Schnellhoof Carriagemaster's]]
}} <!-- End of Western Scharn -->
| group10 = [[Kaarst]]
| list10 =
* [[Anshaung Bridge]]
* [[City Watch Headquarters]]
* [[Kaarst Bay]]
* [[Kaarst City Waterworks Guild]]
* [[Kade Sirrine Kathedrale]]
* [[Karmesin Palast]]
* [[Lighning Tree]]
* [[Mastaff River]]
* [[Ravensfair]]
* [[Sombre Lyceum]]
* [[Squall's Beacon]]
* [[Valiant Morgen Trading Company Kaarst Branch]]
* [[Valiant Morgen Trading Company warehouse]]
{{Navbox|child
| group11 = Taverns
| list11 =
* [[Baron's Cask]]
* [[Cask of the Lonely Drunkard]]
* [[The Copper Roost]]
* [[Drunkard's Cask]]
* [[Jonathan's Tavern]]
* [[The Sunken Giant]]
| group12 = Shops
| list12 =
* [[Delilah's Delicatessen]]
* [[Kaarst Kebab Shop]]
* [[Lily's Pastries and Baked Goods]]
* [[Lion's Apothecary]]
* [[The Night Stone]]
* [[Tiaathque's Medicinal Remedies]]
| group13 = Residences
| list13 =
* [[Therai Doudra's house]]
* [[Kobolwitz Manor]]
* [[Irann Rhogar's house]]
* [[Felosiel Teinithra's house]]
| group14 = Wards
| list14 =
* [[Bell Ward]]
* [[Flock Ward]]
* [[Lamp Ward]]
* [[Mastaff Ward]]
* [[Rook Ward]]
* [[Outer City]]
| group15 = [[Acropolis of Kereskaa]]
| list15 =
* [[Spire of Conjuration]]
* [[Spire of Divination]]
* [[Spire of Necromancy]]
* [[Spire of Abjuration]]
* [[Spire of Evocation]]
* [[Spire of Illusion]]
* [[Spire of Enchantment]]
* [[Spire of Transmutation]]
}} <!-- End of Kaarst -->
}} <!-- End Scharn -->
}} <!-- End of Arkhellen Empire -->
}} <!-- End of Elengon -->
}} <!-- End of Talyen -->
}} <!-- End of Bodies -->
}} <!-- End -->
9743e7b7d279c48045895f84db1d11443189a2e7
Tyrant
0
315
669
552
2024-05-12T13:35:55Z
Vicht
1
Added Category:Eponyms
wikitext
text/x-wiki
In the [[Timeline|Age of Decadence]], a <b>Tyrant</b> ruled [[Kaarst]] with the aid of his arcane followers. They wielded magic to enslave other arcane practitioners, and used that magic to raise a giant statue of the Tyrant to the clifftop above the city. The populace didn't take kindly to the cruelty and overthrew the Tyrant. His statue was collapsed into [[Kaarst Bay]] where only its hand reaches above the surface, coming to be known as [[Tyrant's Folly]]. Being from Kaarst, [[Anrel]] knew this story when the party originally arrived in the harbour, and [[Sable Warden Meriele Berevan]] recounted this story to [[Grokko]] when asked why arcane magic is illegal in Kaarst.
{{Characters}}
[[Category:Eponyms]]
eb3713aba5d7979c5c1667fc48230fcb2ed3e52a
Mystra
0
40
670
449
2024-05-12T13:36:16Z
Vicht
1
Added Category:Eponyms
wikitext
text/x-wiki
The <b>Seven Stars</b>, goddess of Magic. One of the twelve gods of [[Verein Kirche von Arkhelle]]. Her current name of <b>Mystra</b> was used by some tribes of [[human]]s back in the [[Age of Enlightenment]] when her worshippers and students in the [[Acropolis of Kereskaa]] called her <b>Kereskaa</b>.
Her symbol is that of seven stars, referencing the schools of magic, and the phrase is referenced often in writings about her. On the wall of [[Irann Rhogar]]'s house, the words ‘Petty tyrants of lesser gods will not stop us. Seven stars will burn bright this night.’ were written in the blood of two [[Raven Guard]]s. In the amphitheatre of the Acropolis of Kereskaa, the phrases ‘Seven stars light the night sky’, ‘Seven eyes perceive what hides’, and the partial phrases beginning ‘Seven hearts yearn for—’ and ‘Seven stars and seven—’ are carved in the walls in a language [[Mira]] doesn't recognize.
According to [[Suithrathus Luirmo]], Master of [[Divination]], Kereskaa and her most devoted students built the Acropolis to hide and secure the [[Dragon Orb of Drimysthonantas]], said to be able to control [[dragon|black dragons]] supposedly because it contains the soul of a [[Great Wyrm]] from the [[History|Age of Great Ruin]].
== Knives of Mystra ==
As arcane magic is forbidden in [[Kaarst]], where the other gods of Verein Kirche have stained glass windows in [[Kade Sirrine Kathedrale]], Mystra's window is blank, although there are a very few offerings on the altar beneath it. According to [[Uthan]], anyone who openly worships Mystra is followed and searched by members of the church or [[Kaarst City Watch]], and so those who do worship her do so in secret, calling themselves the [[Knives of Mystra]]. When asking about the history of this law, [[Father Glissan]] tells [[Vichthart]] the following.
<blockquote>‘Yes, Kaarst has some unpleasant history with the arcane, dates back to the [[History|Age of Decadence]]. When it joined the [[Arkhellen Empire|Empire]], the churches were united, some exceptions were made to allow the city to maintain its laws banning arcane practice. The worship of Mystra is not outlawed, the arcane practices are.</blockquote>
[[The Tide]] doesn't seem to think the Knives take part in anything dangerous, although some members led by the [[Ashmaker]] do attack [[Kham]] and [[Vichthart]] in the street at night, according to [[Reiner Hoss]], to make a public demonstration. During this attack, the Ashmaker cried out ‘Let it be known, the Faithful of Mystra will no longer be denied in this city,’ with witnesses clearly hearing the mention of Mystra and talking about it afterwards. On the pretense of helping to liberate the worshippers of Mystra, [[Etorn Hadaran]] and [[Irann Rhogar]] convinced members of the Knives to plant masses of explosive [[ashfire oil]] in a certain position underneath Kaarst, to be detonated at sunset on [[Calendar|15th Thelliea]], the same night that Rhogar was due to take part in a meeting of [[Kaarst City Council]].
{{Characters}}
[[Category:Gods of Verein Kirche von Arkhelle]]
[[Category:Eponyms]]
9b3994fa568cdc0220d8e473b637f9c46efa392f
MediaWiki:Common.css
8
42
671
49
2024-05-12T13:47:09Z
Vicht
1
First draft at re-colouring navboxes
css
text/css
/* CSS placed here will be applied to all skins */
#p-logo {
height: 16.25em;
}
#p-logo a {
height: 16.25em;
background-size: 100%;
}
/* Re-colouring navboxes */
.mw-parser-output .navbox-title {
background-color: #3E0C43;
}
.mw-parser-output .navbox-abovebelow,
.mw-parser-output .navbox-group,
.mw-parser-output .navbox-subgroup .navbox-title {
background-color: #674577;
}
.mw-parser-output tr + tr > .navbox-abovebelow,
.mw-parser-output tr + tr > .navbox-group,
.mw-parser-output tr + tr > .navbox-image,
.mw-parser-output tr + tr > .navbox-list {
border-color: #C0D1D9;
}
.mw-parser-output .navbox-subgroup .navbox-group,
.mw-parser-output .navbox-subgroup .navbox-abovebelow {
background-color: #725483;
}
.mw-parser-output .navbox,
.mw-parser-output .navbox-subgroup {
background-color: #C0D1D9;
}
.mw-parser-output .navbox-list {
line-height: 1.5em;
border-color: #C0D1D9;
}
e2697310cd98951428e524dfcbfe4969612a84a9
672
671
2024-05-12T14:08:07Z
Vicht
1
Undo revision [[Special:Diff/671|671]] by [[Special:Contributions/Vicht|Vicht]] ([[User talk:Vicht|talk]])
css
text/css
/* CSS placed here will be applied to all skins */
#p-logo {
height: 16.25em;
}
#p-logo a {
height: 16.25em;
background-size: 100%;
}
d998c48f8bcda1eada27f0766d50aaa4d6a5c14a
673
672
2024-05-12T14:14:56Z
Vicht
1
Changing blue link colour in navboxes
css
text/css
/* CSS placed here will be applied to all skins */
#p-logo {
height: 16.25em;
}
#p-logo a {
height: 16.25em;
background-size: 100%;
}
.navbox a,
.navbox a:visited {
color: #0C65FF;
}
867f111b09411c6cbbd6dc8da0cea4400667dec4
674
673
2024-05-12T14:16:04Z
Vicht
1
Undo revision [[Special:Diff/673|673]] by [[Special:Contributions/Vicht|Vicht]] ([[User talk:Vicht|talk]])
css
text/css
/* CSS placed here will be applied to all skins */
#p-logo {
height: 16.25em;
}
#p-logo a {
height: 16.25em;
background-size: 100%;
}
d998c48f8bcda1eada27f0766d50aaa4d6a5c14a
King Lorenz Friedriche Arkhelle XVI
0
375
675
2024-05-12T15:18:09Z
Vicht
1
Created page with "<b>Lorenz Friedriche Arkhelle</b> is the current king of [[Arkhelle]] and third emperor of the [[Arkhellen Empire]]. Per maps of Imperium Arkhelle, his full title is <b>His Royal Highness Lorenz Friedriche Arkhelle II</b>. Per Fact of the Day [[Sessions|18 September 2022]], as king of Arkhelle, he is <b>King Lorenzo Arkhelle XVI</b> Lorenz came to power 12 years ago ([[Timeline|approximately 1841]]) at the age of 23, and rules from [[Wesselbern Palast]] in [[Hellenhelm]..."
wikitext
text/x-wiki
<b>Lorenz Friedriche Arkhelle</b> is the current king of [[Arkhelle]] and third emperor of the [[Arkhellen Empire]]. Per maps of Imperium Arkhelle, his full title is <b>His Royal Highness Lorenz Friedriche Arkhelle II</b>. Per Fact of the Day [[Sessions|18 September 2022]], as king of Arkhelle, he is <b>King Lorenzo Arkhelle XVI</b>
Lorenz came to power 12 years ago ([[Timeline|approximately 1841]]) at the age of 23, and rules from [[Wesselbern Palast]] in [[Hellenhelm]]. This makes him approximately 35 years old now, and his date of birth approximately 1818.
Lorenz has two sons, born to his wife [[Rosamund]], who recently died.
{{Characters}}
[[Category:Ruling powers]]
f3902e076af11e333b201767920f3f015945d3c9
Rosamund
0
376
676
2024-05-12T15:20:51Z
Vicht
1
Created page with "Recently-deceased wife of [[King Lorenz Friedriche Arkhelle XVI]] and mother of his two children. {{Characters}} [[Category:Deceased characters]]"
wikitext
text/x-wiki
Recently-deceased wife of [[King Lorenz Friedriche Arkhelle XVI]] and mother of his two children.
{{Characters}}
[[Category:Deceased characters]]
c3b1839b28f08af1cacd0de18fdb4b4a8c5149ad
Bane
0
377
677
2024-05-12T15:30:00Z
Vicht
1
Created page with "A [[goblin]] god of war, worshipped by [[Droghen]] and those who work under him. According to [[Talxa]], Droghen enforces this worship and the goblins under his command are not free to worship the other goblin gods, such as those that her altar has statues of. So that the party can cooperate with Droghen's underlings, he gives them his [[symbol of Bane]] to show them, which [[Grokko]] carries. {{Characters}} [[Category:Gods]]"
wikitext
text/x-wiki
A [[goblin]] god of war, worshipped by [[Droghen]] and those who work under him. According to [[Talxa]], Droghen enforces this worship and the goblins under his command are not free to worship the other goblin gods, such as those that her altar has statues of.
So that the party can cooperate with Droghen's underlings, he gives them his [[symbol of Bane]] to show them, which [[Grokko]] carries.
{{Characters}}
[[Category:Gods]]
22f1ae6657ff3565c8a6bca6f5979f96bc8c31bd